วิธีติดตั้ง Kubernetes ด้วย CoreOS (ตอนที่ 2 Worker Node)

ถ้าต้องการระบบจัดการ 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