installation and implementation of k8s clusters on CentOS8

URL Link //n.sfs.tw/15010

2021-03-15 23:29:37 By jung

先紀錄一下安裝遇到的坑洞

https://upcloud.com/community/tutorials/install-kubernetes-cluster-centos-8/

這篇雖然是用centos-8,但是用到的套件是for centos-7的

https://blog.johnwu.cc/article/kubernetes-nodes-notready.html

https://ithelp.ithome.com.tw/articles/10193232

https://www.itread01.com/content/1544953530.html

kubenets CNI 

https://ithelp.ithome.com.tw/articles/10221034

步驟如下

 

1.啟用CentOS-8 cockpit 

systemctl enable --now cockpit.socket 

cockpit 很好用,一定要先開,有web terminal 可以複製貼上

2. 建立master & cluster node之前二台都要做的事

dnf -y upgrade
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
modprobe br_netfilter
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
cat <<EOF > /etc/sysctl.d/k8s.conf
  net.bridge.bridge-nf-call-ip6tables = 1
  net.bridge.bridge-nf-call-iptables = 1
  EOF
echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf

參照 Oracle container User's guide ,將 br_netfilter模組特別寫入/etc/modules-load.d的目錄中,讓重開機後的作業系統能夠自動載入

https://docs.oracle.com/cd/E52668_01/E88884/html/requirements-network.html

sysctl --system

2-1.先把swap關掉,目的是為了提高叢集運作的IO效能

手動關閉

swapoff -a

但重新開機又會啟用,可到/etc/fstab把swap分割區直接註解掉,就永久封印了

2-2.使用yum repo來安裝docker-ce


dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
//需依照版本修改rpm檔名
dnf install docker-ce --nobest -y
systemctl start docker && systemctl enable docker.service

2-3.安裝kubernetes 套件

目前只有支援到el7版本

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
exclude=kubelet kubeadm kubectl
EOF
dnf upgrade -y
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet

 

3.建立k8s master 遇到的坑

kubeadm config images pull

3-1.打開通訊埠

firewall-cmd --zone=public --permanent --add-port={6443,2379,2380,10250,10251,10252}/tcp
firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.0.20/32 accept'
firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=172.17.0.0/16 accept'
firewall-cmd --reload

3-2.啟動kubernetes內部通訊網路aka. CNI

很重要!這邊做錯就要重置CNI 

這裡一定要加"--apiserver-advertise-address="這個參數,帶的是cluster master servies所在的IP

kubeadm init --apiserver-advertise-address=192.168.0.10 --pod-network-cidr 192.168.10.0/16

3-3.將CNI設定檔放到系統指定的位置

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf //啟動kubeadm時,程式提示的方法,用root執行可取代上面三行
 
查到一篇可以改安裝通用的 flannel容器網路介面CNI(Container Network Interface)元件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

https://blog.tomy168.com/2019/08/centos-76-kubernetes.html

 

3-4.啟動位於master節點的Pod服務包

kubectl taint nodes --all node-role.kubernetes.io/master-

3-5.如何重設CNI

kubeadm reset
cd ~/.kube/
rm -rf *

把舊的設定檔清除後,再重新執行

kubeadm init

4.建立Replication controller複本抄寫控制站

4-1.編輯yaml設定檔

vim redis-master-controller.yaml
注意!分節空白間隔一定要有正確階層!否則無法執行!
apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-master
  labels:
    name: redis-master
spec:
  replicas: 1
  selector:
    name: redis-master
  template:
    metadata:
      labels:
        name: redis-master
    spec:
      containers:
      - name: master
        image: kubeguide/redis-master
        ports:
        - containerPort: 6379

4-2.啟動複本抄寫控制

要加 --validate=false 參數
kubectl create -f redis-master-controller.yaml --validate=false
//如果上面都設定正確,執行下列指令就會看到服務已經啟動了
kubectl get rc
kubectl get pods

4-3.觀察kubernetes log狀況

journalctl -f -u kubelet

 

 

5.啟動cluster worker node新增叢集節點

按照上面的步驟裝完k8s及docker ce後,節點怎麼都無法加入master控制站

原來是CNI的問題

找到這個參數將預設的network-plugin=cni 刪除,就正常了

/var/lib/kubelet/kubeadm-flags.env

#KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2"
KUBELET_KUBEADM_ARGS="--pod-infra-container-image=k8s.gcr.io/pause:3.2"

改完要重新啟動kubelet
systemctl restart kubelet

 

修改/etc/fstab將swap永久關閉

vi /etc/fstab 
mount -a
free -h

在mster主要節點上查詢運作中的pods及nodes

kubectl get pods
kubectl get nodes

5-1.節點要開啟防火牆的通訊埠號

firewall-cmd --zone=public --permanent --add-port={10250,30000-32767}/tcp
firewall-cmd --reload

5-2.使用kubeadm加入叢集

在上面主節點啟動時用kubeadm init產生的token來加入叢集

需切換成root或使用sudo

sudo kubeadm join 參數 token會過期(24hr)

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-token/

所以要再到master(control-plane)重新產生節點加入叢集使用的token

kubeadm token create --print-join-command

加上print-join-command會產生完整的指令可以複製貼上到節點終端機執行

節點上必須啟用kubelet及設定docker-ce或cri-o內部網路套件

正確無誤的話,就會出現下列畫面

加上--cri-socket=/var/run/crio/crio.sock 參數是因為第二台ubuntu server當節點我使用cri-o套件管理k8s內部網路

參考這篇

https://tree.rocks/kubernetes-with-multi-server-node-setup-on-ubuntu-server-280066e6b106