step 1 Set up virtual machine.
Set at least 4 processors for virtual machine.
step 2 Set static IP
Edit file /etc/netplan/01-network-manager-all.yaml
Content:
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
enp0s3: # Get from ifconfig
dhcp4: yes
addresses: [192.168.1.190/24] # change
gateway4: 192.168.1.1 # change
# nameservers:
# addresses: [114.114.114.114] # change
Apply the change
netplan apply
step 3 Prepare openssh-server
# Install
sudo apt install openssh-server
# start ssh server
sudo service ssh start
step 4 Shutdown firewall
# show ufw status
sudo ufw status
# disable ufw
sudo ufw disable
step 5 shutdown swap
Edit file /etc/fstab
, comment out line which includes swap
.
Restart the OS, and run free
command.
The swap should be zero like below:
free
Swap: 0 0 0
step 6 Install docker
containerd
is also fine. We use docker here.
apt install docker.io
Change the control group driver to systemd
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uy35zvn6.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# Reload
systemctl daemon-reload
systemctl restart docker
Check docker.
docker version
step 7 Set iptables.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
step 8 Set apt
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# Add GPG
sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
# Add k8s apt source
sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
step 9 Install kubeadm,kubelet,kubectl
sudo apt-get update
sudo apt-get install -y kubelet=1.22.2-00 kubeadm=1.22.2-00 kubectl=1.22.2-00
sudo apt-mark hold kubelet kubeadm kubectl
Initialize k8s cluster. This will take a few seconds.
# apiserver-advertise-address should be the IP of VM.
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.2 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=192.168.1.190
Output:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.1.190:6443 --token <token> \
--discovery-token-ca-cert-hash <hash>
Just follow the output to set kubectl config.
If we run kubectl get node
, we'll find that node is not ready. Because we didn't install network plugin yet.
kubectl get node
NAME STATUS ROLES AGE VERSION
k8s1 NotReady control-plane,master 6m32s v1.22.2
Run journalctl -xeu kubelet
can get the following error.
"Unable to update cni config" err="no networks found in /etc/cni/net.d"
step 10 Install Calico
Remove taint of master node, otherwise Calico pods can not be scheduled to master node.
kubectl taint nodes --all node-role.kubernetes.io/master-
Calico Quick Start
Apply Calico yaml file.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.0/manifests/custom-resources.yaml
Install Calico may take few minutes.
we can check the calico pods status by running command:
kubectl get pod -n calico-system
Output:
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-78687bb75f-5gmjw 1/1 Running 0 8m29s
calico-node-kqwns 1/1 Running 0 8m29s
calico-typha-859b477db7-vtzbs 1/1 Running 0 8m29s
csi-node-driver-k5qdf 2/2 Running 0 5m20s
If all calico pods are running, check the node status.
NAME STATUS ROLES AGE VERSION
k8s1 Ready control-plane,master 30m v1.22.2
Node is ready now.
Check cs.
kubectl get cs
Output:
NAME STATUS MESSAGE ERROR
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
Scheduler is unhealthy, we need to delete --port=0
of file kube-controller-manager.yaml
and kube-scheduler.yaml
in directory /etc/kubernetes/manifests/
Then restart kubelet by running systemctl restart kubelet.service
. We'll see all cs is healthy now.
Output:
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
11 Add other nodes to cluster.
Repeat step 1 to 10. But don't run kubeadm init
, just run kubeadm join
instead. And it will take few seconds to create a calico pod in the new node.
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-78687bb75f-5gmjw 1/1 Running 0 78m
calico-node-87bl4 1/1 Running 0 8m12s
calico-node-kqwns 1/1 Running 0 78m
calico-typha-859b477db7-vtzbs 1/1 Running 0 78m
csi-node-driver-k5qdf 2/2 Running 0 75m
csi-node-driver-tjr26 2/2 Running 0 4m10s
NAME STATUS ROLES AGE VERSION
k8s1 Ready control-plane,master 100m v1.22.2
k8s2 Ready <none> 8m33s v1.22.2