从零部署 Kubernetes (Flannel网络)

注意 flannel 部署成功,但是不同 node 上的 POD IP ping 不同

参考

准备

  • 2-4 台 host(物理机或虚拟机)
  • 操作系统使用最新的 CentOS / Ubuntu x86_64
  • Kubernetes releases 1.7.2
  1. docker pull quay.io/coreos/flannel:v0.8.0-amd64
  2. docker save quay.io/coreos/flannel:v0.8.0-amd64 > ~/flannel_v0.8.0-amd64.tar
  3. docker load -i ~/flannel_v0.8.0-amd64.tar

部署架构图

安装架构

说明:

  • Master 为一台 host ,部署集群需要的服务
  • Node 1 , Node 2, Node 3 为 work 节点
  • etcd
  • flanneld 为 overlay 网络
节点 IP
k8s-master 10.0.0.138
k8s-node-1 10.0.0.123
k8s-node-2 10.0.0.124
k8s-node-3 10.0.0.125

步骤

Master

Config & script

  1. floreks@floreks-MS-7916:~/kubernetes$ cat worker-openssl.cnf
  2. [req]
  3. req_extensions = v3_req
  4. distinguished_name = req_distinguished_name
  5. [req_distinguished_name]
  6. [ v3_req ]
  7. basicConstraints = CA:FALSE
  8. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  9. subjectAltName = @alt_names
  10. [alt_names]
  11. IP.1 = 192.168.0.101
  12. floreks@floreks-MS-7916:~/kubernetes$ cat openssl.cnf
  13. [req]
  14. req_extensions = v3_req
  15. distinguished_name = req_distinguished_name
  16. [req_distinguished_name]
  17. [ v3_req ]
  18. basicConstraints = CA:FALSE
  19. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  20. subjectAltName = @alt_names
  21. [alt_names]
  22. DNS.1 = kubernetes
  23. DNS.2 = kubernetes.default
  24. DNS.3 = kubernetes.default.svc
  25. DNS.4 = kubernetes.default.svc.cluster.local
  26. IP.1 = 10.0.0.1
  27. IP.2 = 10.0.0.138
  1. floreks@floreks-MS-7916:~/kubernetes$ cat generate-certs.sh
  2. #!/bin/bash
  3. # Generate CA
  4. openssl genrsa -out ca.key 2048
  5. openssl req -x509 -new -nodes -key ca.key -days 365 -out ca.crt -subj "/CN=kube-ca"
  6. # Generate api server
  7. openssl genrsa -out apiserver.key 2048
  8. openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kube-apiserver" -config openssl.cnf
  9. openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apiserver.crt -days 365 -extensions v3_req -extfile openssl.cnf
  10. # Generate kubelet
  11. openssl genrsa -out kubelet.key 2048
  12. openssl req -new -key kubelet.key -out kubelet.csr -subj "/CN=kubelet" -config worker-openssl.cnf
  13. openssl x509 -req -in kubelet.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet.crt -days 365 -extensions v3_req -extfile worker-openssl.cnf
  14. # Generate admin
  15. openssl genrsa -out admin.key 2048
  16. openssl req -new -key admin.key -out admin.csr -subj "/CN=kube-admin"
  17. openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out admin.crt -days 365

etcd

安装 etcd :

  1. yum install -y etcd

编辑 /etc/etcd/etcd.conf , 修改 :

  1. ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

重启 etcd :

  1. systemctl restart etcd

kube-apiserver

  1. kube-apiserver \
  2. --bind-address=0.0.0.0 \
  3. --secure-port=443 \
  4. --etcd-servers=http://10.0.0.138:2379 \
  5. --service-cluster-ip-range=10.254.0.0/16 \
  6. --allow-privileged \
  7. --advertise-address 10.0.0.138 \
  8. --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota \
  9. --tls-cert-file ~/config/certs/apiserver.crt \
  10. --tls-private-key-file ~/config/certs/apiserver.key \
  11. --client-ca-file ~/config/certs/ca.crt \
  12. --service-account-key-file ~/config/certs/apiserver.key

kube-scheduler

  1. kube-scheduler --kubeconfig ~/config/var_lib_kubelet/kubeconfig

kube-controller-manager

  1. kube-controller-manager \
  2. --kubeconfig ~/config/var_lib_kubelet/kubeconfig \
  3. --service-account-private-key-file ~/config/certs/apiserver.key \
  4. --root-ca-file ~/config/certs/ca.crt \
  5. --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16

Node

以 k8s-node-1 为例

kubelet

创建 kubeconfig 配置文件:

  1. kubectl config set-cluster kubernetes \
  2. --server=http://192.168.122.58:8080 \
  3. --kubeconfig=kubeconfig
  4. # 设置上下文参数
  5. kubectl config set-context default \
  6. --cluster=kubernetes \
  7. --user=kubelet \
  8. --kubeconfig=kubeconfig
  9. # 设置默认上下文
  10. kubectl config use-context default --kubeconfig=kubeconfig

生成的 kubeconfig 配置文件如下:

  1. apiVersion: v1
  2. clusters:
  3. - cluster:
  4. server: http://192.168.122.58:8080
  5. name: kubernetes
  6. contexts:
  7. - context:
  8. cluster: kubernetes
  9. user: kubelet
  10. name: default
  11. current-context: default
  12. kind: Config
  13. preferences: {}
  14. users: []

启动 kubelet :

  1. kubelet \
  2. --require-kubeconfig \
  3. --kubeconfig=/root/config/var_lib_kubelet/kubeconfig \
  4. --pod-infra-container-image=ibmcom/pause:3.0 \
  5. --network-plugin=cni \
  6. --allow-privileged

注意 默认路径 /var/lib/kubelet/kubeconfig

cat /var/lib/kubelet/kubeconfig

  1. current-context: default-context
  2. apiVersion: v1
  3. clusters:
  4. - cluster:
  5. certificate-authority: /root/certs/ca.crt
  6. server: https://10.0.0.122
  7. name: default-cluster
  8. contexts:
  9. - context:
  10. cluster: default-cluster
  11. user: admin
  12. name: default-context
  13. - context:
  14. kind: Config
  15. preferences: {}
  16. users:
  17. - name: admin
  18. user:
  19. client-certificate: /root/certs/admin.crt
  20. client-key: /root/certs/admin.key

kube-proxy

  1. kube-proxy --kubeconfig /root/config/var_lib_kubelet/kubeconfig --proxy-mode=iptables

kube-proxy --kubeconfig /var/lib/kubelet/kubeconfig --proxy-mode=iptables

问题

pause 映像替换

https://hub.docker.com/r/ibmcom/pause/

  1. --pod-infra-container-image=ibmcom/pause:3.0

模块说明

Flannel

  1. kubectl apply -f kube-flannel.yml

查看:

  1. kubectl get ds --all-namespaces -o wide

查看详细描述:

  1. kubectl describe ds kube-flannel-ds --namespace kube-system

注意 flannel cni 插件安装(所有kubelet node都需要安装)

  1. # cd
  2. # wget https://github.com/containernetworking/plugins/releases/download/v0.6.0/cni-plugins-amd64-v0.6.0.tgz
  3. # mkdir -pv /opt/cni/bin
  4. # cd /opt/cni/bin
  5. # tar xf ~/cni-plugins-amd64-v0.6.0.tgz

错误

spec.template.spec.containers[0].securityContext.privileged
  1. The DaemonSet "kube-flannel-ds" is invalid: spec.template.spec.containers[0].securityContext.privileged: Forbidden: disallowed by cluster policy

--allow-privileged 启动 kubelet, kube-apiserver

failed to get default interface

查看node上的flannel容器退出错误信息:

  1. failed to get default interface: Unable to find default route
/var/run/secrets/kubernetes.io/serviceaccount/token
  1. Failed to create SubnetManager: unable to initialize inclusterconfig: open /var/run/secrets/kubernetes.io/serviceaccount/token: no such file or directory
  1. No API token found for service account "flannel"
  1. Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-01kcn': Get https://10.254.0.1:443/api/v1/namespaces/kube-system/pods/kube-flan
  2. nel-ds-01kcn: dial tcp 10.254.0.1:443: getsockopt: no route to host
  1. iptables -t nat -A PREROUTING -d 10.254.0.1 -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1
  1. Expected to load root CA config from /var/run/secrets/kubernetes.io/serviceaccount/ca.crt, but got err: open /var/run/secrets/kubernetes.io/serviceaccount/ca.crt: no such file or directory
  1. Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-01kcn': Get https://10.254.0.1:443/api/v1/namespaces/kube-system/pods/kube-flannel-ds-01kcn: x509: failed to load system roots and no roots provided
  1. Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-01kcn': the server has asked for the client to provide credentials (get pods kube-flannel-ds-01kcn)
  1. Error registering network: failed to acquire lease: node "k8s-node-3" pod cidr not assigned

kube-controller-manager增加选项:

  1. --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16

Tips

查看日志

  1. kubectl -n kube-system logs -c kube-flannel kube-flannel-ds-gc076

重置

集群创建过程中出现问题,可以重置环境

etcd

  1. systemctl stop etcd
  2. rm -rf /var/lib/etcd/
  3. mkdir -pv /var/lib/etcd/
  4. chown -R etcd.etcd /var/lib/etcd/
  5. systemctl start etcd

参考