Skip to content

Instantly share code, notes, and snippets.

@lucashalbert
Created March 7, 2019 17:31
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 13 You must be signed in to fork a gist
  • Save lucashalbert/d7ec46fe306ff14ce44dbbac2d5ca88e to your computer and use it in GitHub Desktop.
Save lucashalbert/d7ec46fe306ff14ce44dbbac2d5ca88e to your computer and use it in GitHub Desktop.
Script to install and configure kubernetes on CentOS-7
#######################
# === All Systems === #
#######################
# Ensure system is fully patched
sudo yum -y makecache fast
sudo yum -y update
# Disable swap
sudo swapoff -a
# comment out swap mount in /etc/fstab
sudo vi /etc/fstab
# Disable default iptables configuration as it will break kubernetes services (API, coredns, etc...)
sudo sh -c "cp /etc/sysconfig/iptables /etc/sysconfig/iptables.ORIG && iptables --flush && iptables --flush && iptables-save > /etc/sysconfig/iptables"
sudo systemctl restart iptables.service
# Load/Enable br_netfilter kernel module and make persistent
sudo modprobe br_netfilter
sudo sh -c "echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables"
sudo sh -c "echo '1' > /proc/sys/net/bridge/bridge-nf-call-ip6tables"
sudo sh -c "echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf"
sudo sh -c "echo 'net.bridge.bridge-nf-call-ip6tables=1' >> /etc/sysctl.conf"
# Install dependencies for docker-ce
sudo yum -y install yum-utils device-mapper-persistent-data lvm2
# Add the docker-ce repository
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Add the Kubernetes Repository
sudo sh -c 'cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF'
# Update yum cache after adding repository
sudo yum -y makecache fast
# Install latest supported docker runtime (18.06 is the latest runtime supported by Kubernetes v1.13.2)
sudo yum -y install docker-ce-18.06.1.ce
# Install Kubernetes
sudo yum -y install kubelet kubeadm kubectl
# Enable kubectl bash-completion
sudo yum -y install bash-completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
# Enable docker and kubelet services
sudo systemctl enable docker.service
sudo systemctl enable kubelet.service
# reboot
sudo reboot
# Check what cgroup driver that docker is using
sudo docker info | grep -i cgroup
# Add the cgroup driver from the previous step to the kublet config as an extra argument
sudo sed -i "s/^\(KUBELET_EXTRA_ARGS=\)\(.*\)$/\1\"--cgroup-driver=$(sudo docker info | grep -i cgroup | cut -d" " -f3)\2\"/" /etc/sysconfig/kubelet
#######################
# === Master Only === #
#######################
# Initialize the Kubernetes master using the public IP address of the master as the apiserver-advertise-address. Set the pod-network-cidr to the cidr address used in the network overlay (flannel, weave, etc...) configuration.
curl -s https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | grep -E '"Network": "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}"' | cut -d'"' -f4
sudo kubeadm init --apiserver-advertise-address=${master_ip_address} --pod-network-cidr=${NETWORK_OVERLAY_CIDR_NET}
# Copy the cluster configuration to the regular users home directory
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# Deploy the Flannel Network Overlay
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# check the readiness of nodes
kubectl get nodes
# check that coredns, apiserver, etcd, and flannel pods are running
kubectl get pods --all-namespaces
# List k8s bootstrap tokens
sudo kubeadm token list
# Generate a new k8s bootstrap token !ONLY! if all other tokens have expired
sudo kubeadm token create
# Decode the Discovery Token CA Cert Hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
########################
# === Workers Only === #
########################
# Join worker node to k8s cluster using the token and discovery-token-ca-cert-hash from master
sudo kubeadm join ${MASTER_HOSTNAME}:6443 --token ${TOKEN} --discovery-token-ca-cert-hash sha256:${DISCOVERY_TOKEN_CA_CERT_HASH}
#########################
# === Reset Cluster === #
#########################
# Reset Cluster
sudo kubeadm reset
# Clean up iptable remnants
sudo sh -c "iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X"
# Clean up network overlay remnants
sudo ip link delete cni0
sudo ip link delete flannel.1
###########################
# === Troubleshooting === #
###########################
# If exposed deployment intermittently responds with "no route to host", run the following on the troublesome host
sudo sh -c "iptables --flush && iptables --flush" && sudo systemctl restart docker.service
# If the previous command fixes the intermittent problem, there is most likely an iptables rule preventing incoming traffic to the ingress controller
sudo sh -c "cp /etc/sysconfig/iptables /etc/sysconfig/iptables.ORIG && iptables --flush && iptables --flush && iptables-save > /etc/sysconfig/iptables"
sudo systemctl restart iptables.service
sudo systemctl restart docker.service
@rungao
Copy link

rungao commented Nov 22, 2022

tks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment