k8s安裝之node節點

kubernetes node

安裝kubelet
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用戶,對集羣擁有所有權限。

創建WorkingDirectory
mkdir /var/lib/kubelet
啓動
swapoff -a
systemctl daemon-reload
systemctl start kubelet
去master節點通過kubelet的TLS證書請求
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上執行賦權語句。

kube-proxy
啓動文件
/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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章