ถ้าต้องการระบบจัดการ docker container สักตัวต้องทำอย่างไร (ตอนที่ 2)
จากตอนก่อนหน้านี้ รู้จักกับ Kubernetes และวิธีติดตั้ง Kubernetes ด้วย CoreOS (ตอนที่ 1 Master Node)[1] ก็มาต่อด้วยการติดตั้งบนเครื่อง Worker ต่อครับ
วิธีการติดตั้ง Kubernetes Worker Node[2]
- ทำการติดตั้ง CoreOS บน Worker Node
- สร้าง directory ดังนี้
sudo mkdir -p /etc/kubernetes/ssl
- ทำการ copy ที่สร้างไว้ก่อนหน้านี้มาไว้ใน folder ดังนี้
File: /etc/kubernetes/ssl/ca.pem File: /etc/kubernetes/ssl/${WORKER_FQDN}-worker.pem File: /etc/kubernetes/ssl/${WORKER_FQDN}-worker-key.pem
- เปลี่ยน permission และ owner file เฉพาะไฟล์ -key* ดังนี้
sudo chmod 600 /etc/kubernetes/ssl/*-key.pem sudo chown root:root /etc/kubernetes/ssl/*-key.pem
- ทำการทำ link เผื่อให้ config แต่ละ worker เหมือน ๆ กัน
cd /etc/kubernetes/ssl/ sudo ln -s ${WORKER_FQDN}-worker.pem worker.pem sudo ln -s ${WORKER_FQDN}-worker-key.pem worker-key.pem
- จากนั้นตั้งค่า flannel network เป็น network ที่เอาไว้เชื่อมแต่ละ pod ให้สามารถคุยกันได้ข้ามเครื่อง เพื่อสร้างวง virtual ip ให้กับ pod ดังนี้
sudo mkdir /etc/flannel
ทำการสร้างไฟล์ option.env
sudo vim /etc/flannel/options.env
เนื้อหาในไฟล์ดังนี้
FLANNELD_IFACE=<Worker IP> FLANNELD_ETCD_ENDPOINTS=http://<Master IP>:2379,http://<Node1 IP>:2379,http://<Node2 IP>:2379
- จากนั้นทำการสร้าง flannel service ดังนี้
sudo mkdir -p /etc/systemd/system/flanneld.service.d/ sudo vim /etc/systemd/system/flanneld.service.d/40-ExecStartPre-symlink.conf
เนื้อหาในไฟล์ดังนี้
[Service] ExecStartPre=/usr/bin/ln -sf /etc/flannel/options.env /run/flannel/options.env
- จากนั้นทำการตั้งค่า docker เพื่อกำหนดให้ใช้งานผ่าน flannel โดยสร้างไฟล์ config ดังนี้
sudo mkdir -p /etc/systemd/system/docker.service.d sudo vim /etc/systemd/system/docker.service.d/40-flannel.conf
เนื้อหาในไฟล์ดังนี้
[Unit] Requires=flanneld.service After=flanneld.service [Service] EnvironmentFile=/etc/kubernetes/cni/docker_opts_cni.env
โดยที่ทำสร้างไฟล์ docker_opts_cni.env ขึ้นมาประกอบดังนี้
sudo mkdir -p /etc/kubernetes/cni sudo vim /etc/kubernetes/cni/docker_opts_cni.env
เนื้อหาในไฟล์ดังนี้
DOCKER_OPT_BIP="" DOCKER_OPT_IPMASQ=""
- จากนั้นทำการ restart docker service สักรอบดังนี้
sudo systemctl restart docker
- หนังจากนั้นทำการสร้าง config ไฟล์สุดท้ายสำหรับ flannel ดังนี้
sudo mkdir -p /etc/kubernetes/cni/net.d sudo vim /etc/kubernetes/cni/net.d/10-flannel.conf
เนื้อหาในไฟล์ดังนี้
{ "name": "podnet", "type": "flannel", "delegate": { "isDefaultGateway": true } }
- ทำการ start flannel service และตรวจสถานะการทำงานดู
sudo systemctl start flanneld sudo systemctl enable flanneld sudo systemctl status flanneld
- จากนั้นทำการสร้าง kubelet service ดังนี้
sudo vim /etc/systemd/system/kubelet.service
เนื้อหาในไฟล์ดังนี้ (KUBELET_IMAGE_TAG version สามารถตรวจสอบล่าสุดได้ที่ https://quay.io/repository/coreos/hyperkube?tab=tags)
[Service] Environment=KUBELET_IMAGE_TAG=v1.6.2_coreos.0 Environment="RKT_RUN_ARGS=--uuid-file-save=/var/run/kubelet-pod.uuid \ --volume var-log,kind=host,source=/var/log \ --mount volume=var-log,target=/var/log \ --volume dns,kind=host,source=/etc/resolv.conf \ --mount volume=dns,target=/etc/resolv.conf" ExecStartPre=/usr/bin/mkdir -p /etc/kubernetes/manifests ExecStartPre=/usr/bin/mkdir -p /var/log/containers ExecStartPre=-/usr/bin/rkt rm --uuid-file=/var/run/kubelet-pod.uuid ExecStart=/usr/lib/coreos/kubelet-wrapper \ --api-servers=https://<Master_IP> \ --cni-conf-dir=/etc/kubernetes/cni/net.d \ --network-plugin=cni \ --container-runtime=docker \ --register-node=true \ --allow-privileged=true \ --pod-manifest-path=/etc/kubernetes/manifests \ --cluster_dns=<DNS_SERVICE_IP> \ --cluster_domain=<CLUSTER_DNS_NAME> \ --kubeconfig=/etc/kubernetes/worker-kubeconfig.yaml \ --tls-cert-file=/etc/kubernetes/ssl/worker.pem \ --tls-private-key-file=/etc/kubernetes/ssl/worker-key.pem ExecStop=-/usr/bin/rkt stop --uuid-file=/var/run/kubelet-pod.uuid Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
- ทำการ start kubelet service และตรวจสถานะการทำงานดู (ต้องรอสักพักเพราะ service จะต้องโหลด image มาติดตั้งให้ในการ start ครั้งแรก สามารถใช้คำสั่ง journalctl -xe เพื่อตรวจสอบสถานะการทำงาน) ซึ่งจะพบว่ายัง error เพราะยังไม่ได้ลง kube-apiserver (แนะนำลงตัวอื่นให้เสร็จให้หมดแล้วค่อยมา start kubelet service ก็ได้)
sudo systemctl start kubelet sudo systemctl enable kubelet sudo systemctl status kubelet
- หลังจากนั้นทำการติดตั้ง kube-proxy ดังนี้
sudo vim /etc/kubernetes/manifests/kube-proxy.yaml
มีเนื้อหาในไฟล์ดังนี้
apiVersion: v1 kind: Pod metadata: name: kube-proxy namespace: kube-system spec: hostNetwork: true containers: - name: kube-proxy image: quay.io/coreos/hyperkube:v1.6.2_coreos.0 command: - /hyperkube - proxy - --master=https://${MASTER_IP} - --kubeconfig=/etc/kubernetes/worker-kubeconfig.yaml securityContext: privileged: true volumeMounts: - mountPath: /etc/ssl/certs name: "ssl-certs" - mountPath: /etc/kubernetes/worker-kubeconfig.yaml name: "kubeconfig" readOnly: true - mountPath: /etc/kubernetes/ssl name: "etc-kube-ssl" readOnly: true volumes: - name: "ssl-certs" hostPath: path: "/usr/share/ca-certificates" - name: "kubeconfig" hostPath: path: "/etc/kubernetes/worker-kubeconfig.yaml" - name: "etc-kube-ssl" hostPath: path: "/etc/kubernetes/ssl"
- ต่อด้วยการตั้งค่า kubeconfig ดังนี้
sudo vim /etc/kubernetes/worker-kubeconfig.yaml
มีเนื้อหาในไฟล์ดังนี้
apiVersion: v1 kind: Config clusters: - name: local cluster: certificate-authority: /etc/kubernetes/ssl/ca.pem users: - name: kubelet user: client-certificate: /etc/kubernetes/ssl/worker.pem client-key: /etc/kubernetes/ssl/worker-key.pem contexts: - context: cluster: local user: kubelet name: kubelet-context current-context: kubelet-context
- ในกรณีที่ต้องการแจ้ง systemd ว่าเรามีการเปลี่ยนข้อมูลใน config และต้องการ rescan ทุกอย่างอีกครั้งให้สั่งดังนี้
sudo systemctl daemon-reload
- จากนั้นทดสอบ restart kubelet service ใหม่อีกครั้งและตรวจสอบ status หรือ journalctl -xe เพื่อดูว่าการทำงานปกติหรือไม่ ถ้าไม่แก้ให้ถูกต้องแล้ว restart ใหม่อีกครั้งไปเรื่อย ๆ จนกว่าจะปกติ
sudo systemctl restart kubelet
จบไปแล้วครับสำหรับการติดตั้ง worker node ครับ ต่อด้วยการติดตั้ง Kubectl สำหรับตรวจสอบสถานะแต่ละ Node ครับ
วิธีการติดตั้ง Kubectl[3]
- ทำการ Download tool ในที่นี้จะติดตั้งลงบนเครื่องอื่นที่ไม่ใช่ coreos (อย่าลืม copy เอา ca.pem,admin.pem,admin-key.pem ไปด้วย) เพราะ coreos ไม่อนุญาติให้เขียนบนพื้นที่ ../bin (จริง ๆ ติดตั้งที่ใดก็ได้ OS ใดก็ได้ครับยกตัวอย่าง windows[4]) โดยเลือก Version ให้สอดคล้องกับที่ใช้งานอยู่ครับ
curl -O https://storage.googleapis.com/kubernetes-release/release/v1.6.2/bin/linux/amd64/kubectl
- จากนั้นทำการเปลี่ยน permission ให้ execute ได้ และ ทำการ copy ไป global command
chmod +x kubectl sudo mv kubectl /usr/local/sbin/
- จากนั้นทำการตั้งค่าโปรแกรม (ต้องรันทุกครั้งหลังจาก Restart เครื่อง)
kubectl config set-cluster default-cluster --server=https://<MASTER_IP> --certificate-authority=<cer path>/ca.pem kubectl config set-credentials default-admin --certificate-authority=<cer path>/ca.pem, --client-key=<cer path>/admin-key.pem --client-certificate=<cer path>/admin.pem kubectl config set-context default-system --cluster=default-cluster --user=default-admin kubectl config use-context default-system
- จากนั้นจะสามารถใช้คำสั่งตรวจสอบสถานะได้ดังนี้
./kubectl get nodes
จบไปแล้วครับสำหรับวิธีติดตั้ง Worker Node และ Kubectl ถ้าทำไม่ได้ลองทำซ้ำ ๆ ดูครับ ลองดู docker logs <containner_id> ตรวจดูปัญหาใน docker และ journalctl -xe เพื่อตรวจสอบ service ดูครับ…..
==================================
Reference :
[1] รู้จักกับ Kubernetes และวิธีติดตั้ง Kubernetes ด้วย CoreOS (ตอนที่ 1 Master Node) : https://sysadmin.psu.ac.th/2017/05/17/setup-kubernetes-coreos-section-1/
[2] CoreOS -> Deploy Kubernetes Worker Node(s) : https://coreos.com/kubernetes/docs/latest/deploy-workers.html
[3] CoreOS -> Setting up kubectl : https://coreos.com/kubernetes/docs/latest/configure-kubectl.html
[4] Running kubectl on Windows : https://github.com/eirslett/kubectl-windows