wget https://storage.googleapis.com/kubernetes-release/release/v1.11.0/kubernetes-server-linux-amd64.tar.gz tar -xzvf kubernetes-server-linux-amd64.tar.gz cd kubernetes tar -zxf kubernetes-src.tar.gz scp kubernetes/server/bin/{kube-proxy,kubelet} k8s-node1:/usr/local/bin/ scp kubernetes/server/bin/{kube-proxy,kubelet} k8s-node2:/usr/local/bin/ ##### 生成kubelet權限,下面這條命令只在master點執行一次便可 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap ######說明 kubelet 啓動時向 kube-apiserver 發送 TLS bootstrapping 請求,須要先將 bootstrap token 文件中的 kubelet-bootstrap 用戶賦予 system:node-bootstrapper 角色,而後 kubelet 纔有權限建立認證請求 1.8版本以前.開啓rbac後,apiserver默認綁定system:nodes組到system:node的clusterrole。v1.8以後,此綁定默認不存在,須要手工綁定,不然kubelet啓動後會報認證錯誤,使用kubectl get nodes查看沒法成爲Ready狀態。 kubectl create clusterrolebinding kubelet-node-clusterbinding --clusterrole=system:node --group=system:nodes ######建立啓動文件 /usr/lib/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet ExecStart=/usr/local/sbin/kubelet \ --address=172.16.20.206 \ --hostname-override=172.16.20.206 \ --cluster-dns=10.254.0.2 \ --network-plugin=cni \ --cni-conf-dir=/etc/cni/net.d \ --cni-bin-dir=/opt/cni/bin \ --logtostderr=true \ --v=2 \ --allow-privileged=true \ --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 \ --cgroups-per-qos \ --cgroup-driver=cgroupfs \ --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local \ --hairpin-mode promiscuous-bridge \ --serialize-image-pulls=false \ --runtime-cgroups=/systemd/system.slice \ --kubelet-cgroups=/systemd/system.slice \ --enforce-node-allocatable=pods \ --kube-reserved=cpu=1,memory=2Gi,ephemeral-storage=5Gi \ --system-reserved=cpu=1,memory=2Gi,ephemeral-storage=5Gi \ --eviction-hard=memory.available<1Gi,nodefs.available<10% Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
#######說明
–address 是本機ip,不能設置爲 127.0.0.1,不然後續 Pods 訪問 kubelet 的 API 接口時會失敗,由於 Pods 訪問的 127.0.0.1 指向本身而不是 kubelet;
–hostname-override 也是本機IP;
–cgroup-driver 配置成 cgroupfs(保持docker和kubelet中的cgroup driver配置一致便可), docker默認的cgroup-driver爲 cgrouopfs ;
–experimental-bootstrap-kubeconfig 指向 bootstrap kubeconfig 文件,kubelet 使用該文件中的用戶名和 token 向 kube-apiserver 發送 TLS Bootstrapping 請求;
管理員經過了 CSR 請求後,kubelet 自動在 –cert-dir 目錄建立證書和私鑰文件(kubelet-client.crt 和 kubelet-client.key),而後寫入 –kubeconfig 文件(自動建立 –kubeconfig 指定的文件);
建議在 –kubeconfig 配置文件中指定 kube-apiserver 地址,若是未指定 –api-servers 選項,則必須指定 –require-kubeconfig 選項後才從配置文件中讀取 kue-apiserver 的地址,不然 kubelet 啓動後將找不到 kube-apiserver (日誌中提示未找到 API Server),kubectl get nodes 不會返回對應的 Node 信息;
–cluster-dns 指定 kubedns 的 Service IP(能夠先分配,後續建立 kubedns 服務時指定該 IP),–cluster-domain 指定域名後綴,這兩個參數同時指定後纔會生效;
kubelet 中的dns地址是cluster的IP也就是服務service的IP並非pod的IP,要在--service-cluster-ip-range 這個IP段裏
–cluster-domain 指定 pod 啓動時 /etc/resolve.conf 文件中的 search domain ,起初咱們將其配置成了 cluster.local.,這樣在解析 service 的 DNS 名稱時是正常的,但是在解析 headless service 中的 FQDN pod name 的時候卻錯誤,所以咱們將其修改成 cluster.local,去掉嘴後面的 」點號「 就能夠解決該問題;
–kubeconfig=/etc/kubernetes/kubelet.kubeconfig中指定的kubelet.kubeconfig文件在第一次啓動kubelet以前並不存在,請看下文,當經過CSR請求後會自動生成kubelet.kubeconfig文件,若是你的節點上已經生成了~/.kube/config文件,你能夠將該文件拷貝到該路徑下,並重命名爲kubelet.kubeconfig,全部node節點能夠共用同一個kubelet.kubeconfig文件,這樣新添加的節點就不須要再建立CSR請求就能自動添加到kubernetes集羣中。一樣,在任意可以訪問到kubernetes集羣的主機上使用kubectl –kubeconfig命令操做集羣時,只要使用~/.kube/config文件就能夠經過權限認證,由於這裏面已經有認證信息並認爲你是admin用戶,對集羣擁有全部權限。 node
mkdir /var/lib/kubelet
swapoff -a systemctl daemon-reload systemctl start kubelet
kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-HSfbVhUD6BXSdM4jSRcyA5b_4IID_tzFfJQExkzd2NE 1m kubelet-bootstrap Pending node-csr-mzWxGlRuf_6CBxr0pL8eDaPrrpLorcPwAVPKAkM4m3g 13m kubelet-bootstrap Pending kubectl certificate approve node-csr-HSfbVhUD6BXSdM4jSRcyA5b_4IID_tzFfJQExkzd2NE node-csr-mzWxGlRuf_6CBxr0pL8eDaPrrpLorcPwAVPKAkM4m3g
kubectl get nodes NAME STATUS ROLES AGE VERSION 172.16.20.207 Ready <none> 1m v1.11.0 172.16.20.208 Ready <none> 1m v1.11.0
此處若是查看沒有節點加入,那麼查看node節點message日誌,報錯沒有權限,那麼在master上執行賦權語句。linux
/usr/lib/systemd/system/kube-proxy.service [Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] ExecStart=/usr/local/bin/kube-proxy \ --logtostderr=true \ --v=2 \ --master=172.16.100.1:8080 \ --bind-address=172.16.20.206 \ --hostname-override=172.16.20.206 \ --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \ --cluster-cidr=10.254.0.0/16 Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
systemctl daemon-reload systemctl start kube-proxy