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用戶,對集羣擁有全部權限。 node

建立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上執行賦權語句。linux

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
相關文章
相關標籤/搜索