<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 部署node節點 Kubernetes node節點包含如下組件: + Flanneld:參考我之前寫的文章[Kubernetes基于Flannel的網絡配置](https://jimmysong.io/posts/kubernetes-network-config/),之前沒有配置TLS,現在需要在service配置文件中增加TLS配置,安裝過程請參考上一節[安裝flannel網絡插件](flannel-installation.md)。 + Docker1.12.5:docker的安裝很簡單,這里也不說了,但是需要注意docker的配置。 + kubelet:直接用二進制文件安裝 + kube-proxy:直接用二進制文件安裝 **注意**:每臺 node 上都需要安裝 flannel,master 節點上可以不安裝。 **步驟簡介** 1. 確認在上一步中我們安裝配置的網絡插件flannel已啟動且運行正常 2. 安裝配置docker后啟動 3. 安裝配置kubelet、kube-proxy后啟動 4. 驗證 ## 目錄和文件 我們再檢查一下三個節點上,經過前幾步操作我們已經創建了如下的證書和配置文件。 ``` bash $ ls /etc/kubernetes/ssl admin-key.pem admin.pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem kubernetes-key.pem kubernetes.pem $ ls /etc/kubernetes/ apiserver bootstrap.kubeconfig config controller-manager kubelet kube-proxy.kubeconfig proxy scheduler ssl token.csv ``` ## 配置Docker > 如果您使用yum的方式安裝的flannel則不需要執行mk-docker-opts.sh文件這一步,參考Flannel官方文檔中的[Docker Integration](https://github.com/coreos/flannel/blob/master/Documentation/running.md)。 如果你不是使用yum安裝的flannel,那么需要下載flannel github release中的tar包,解壓后會獲得一個**mk-docker-opts.sh**文件,到[flannel release](https://github.com/coreos/flannel/releases)頁面下載對應版本的安裝包,該腳本見[mk-docker-opts.sh](https://github.com/rootsongjc/kubernetes-handbook/tree/master/tools/flannel/mk-docker-opts.sh),因為我們使用yum安裝所以不需要執行這一步。 這個文件是用來`Generate Docker daemon options based on flannel env file`。 使用`systemctl`命令啟動flanneld后,會自動執行`./mk-docker-opts.sh -i`生成如下兩個文件環境變量文件: - /run/flannel/subnet.env ```ini FLANNEL_NETWORK=172.30.0.0/16 FLANNEL_SUBNET=172.30.46.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=false ``` - /run/docker_opts.env ```ini DOCKER_OPT_BIP="--bip=172.30.46.1/24" DOCKER_OPT_IPMASQ="--ip-masq=true" DOCKER_OPT_MTU="--mtu=1450" ``` Docker將會讀取這兩個環境變量文件作為容器啟動參數。 **注意:**不論您用什么方式安裝的flannel,下面這一步是必不可少的。 **yum方式安裝的flannel** 修改docker的配置文件`/usr/lib/systemd/system/docker.service`,增加一條環境變量配置: ```ini EnvironmentFile=-/run/flannel/docker ``` `/run/flannel/docker`文件是flannel啟動后自動生成的,其中包含了docker啟動時需要的參數。 **二進制方式安裝的flannel** 修改docker的配置文件`/usr/lib/systemd/system/docker.service`,增加如下幾條環境變量配置: ```ini EnvironmentFile=-/run/docker_opts.env EnvironmentFile=-/run/flannel/subnet.env ``` 這兩個文件是`mk-docker-opts.sh`腳本生成環境變量文件默認的保存位置,docker啟動的時候需要加載這幾個配置文件才可以加入到flannel創建的虛擬網絡里。 所以不論您使用何種方式安裝的flannel,將以下配置加入到`docker.service`中可確保萬無一失。 ```ini EnvironmentFile=-/run/flannel/docker EnvironmentFile=-/run/docker_opts.env EnvironmentFile=-/run/flannel/subnet.env EnvironmentFile=-/etc/sysconfig/docker EnvironmentFile=-/etc/sysconfig/docker-storage EnvironmentFile=-/etc/sysconfig/docker-network EnvironmentFile=-/run/docker_opts.env ``` 請參考[docker.service](https://github.com/rootsongjc/kubernetes-handbook/blob/master/systemd/docker.service)中的配置。 ### 啟動docker 重啟了docker后還要重啟kubelet,這時又遇到問題,kubelet啟動失敗。報錯: ```bash Mar 31 16:44:41 test-002.jimmysong.io kubelet[81047]: error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd" ``` 這是kubelet與docker的**cgroup driver**不一致導致的,kubelet啟動的時候有個`—cgroup-driver`參數可以指定為"cgroupfs"或者“systemd”。 ```bash --cgroup-driver string Driver that the kubelet uses to manipulate cgroups on the host. Possible values: 'cgroupfs', 'systemd' (default "cgroupfs") ``` 配置docker的service配置文件`/usr/lib/systemd/system/docker.service`,設置`ExecStart`中的`--exec-opt native.cgroupdriver=systemd`。 ## 安裝和配置kubelet **kubernets1.8** 相對于kubernetes1.6集群必須進行的配置有: 對于kuberentes1.8集群,必須關閉swap,否則kubelet啟動將失敗。 修改`/etc/fstab`將,swap系統注釋掉。 --- kubelet 啟動時向 kube-apiserver 發送 TLS bootstrapping 請求,需要先將 bootstrap token 文件中的 kubelet-bootstrap 用戶賦予 system:node-bootstrapper cluster 角色(role), 然后 kubelet 才能有權限創建認證請求(certificate signing requests): ``` bash cd /etc/kubernetes kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap ``` + `--user=kubelet-bootstrap` 是在 `/etc/kubernetes/token.csv` 文件中指定的用戶名,同時也寫入了 `/etc/kubernetes/bootstrap.kubeconfig` 文件; --- kubelet 通過認證后向 kube-apiserver 發送 register node 請求,需要先將 `kubelet-nodes` 用戶賦予 `system:node` cluster角色(role) 和 `system:nodes` 組(group), 然后 kubelet 才能有權限創建節點請求: ``` bash kubectl create clusterrolebinding kubelet-nodes \ --clusterrole=system:node \ --group=system:nodes ``` ### 下載最新的kubelet和kube-proxy二進制文件 注意請下載對應的Kubernetes版本的安裝包。 ``` bash wget https://dl.k8s.io/v1.6.0/kubernetes-server-linux-amd64.tar.gz tar -xzvf kubernetes-server-linux-amd64.tar.gz cd kubernetes tar -xzvf kubernetes-src.tar.gz cp -r ./server/bin/{kube-proxy,kubelet} /usr/local/bin/ ``` ### 創建kubelet的service配置文件 文件位置`/usr/lib/systemd/system/kubelet.service`。 ```ini [Unit] Description=Kubernetes Kubelet Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/kubelet ExecStart=/usr/local/bin/kubelet \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBELET_API_SERVER \ $KUBELET_ADDRESS \ $KUBELET_PORT \ $KUBELET_HOSTNAME \ $KUBE_ALLOW_PRIV \ $KUBELET_POD_INFRA_CONTAINER \ $KUBELET_ARGS Restart=on-failure [Install] WantedBy=multi-user.target ``` kubelet的配置文件`/etc/kubernetes/kubelet`。其中的IP地址更改為你的每臺node節點的IP地址。 **注意:**在啟動kubelet之前,需要先手動創建`/var/lib/kubelet`目錄。 下面是kubelet的配置文件`/etc/kubernetes/kubelet`: **kubernetes1.8** 相對于kubenrete1.6的配置變動: - 對于kuberentes1.8集群中的kubelet配置,取消了`KUBELET_API_SERVER`的配置,而改用kubeconfig文件來定義master地址,所以請注釋掉`KUBELET_API_SERVER`配置。 ``` bash ### ## kubernetes kubelet (minion) config # ## The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=172.20.0.113" # ## The port for the info server to serve on #KUBELET_PORT="--port=10250" # ## You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname-override=172.20.0.113" # ## location of the api-server ## COMMENT THIS ON KUBERNETES 1.8+ KUBELET_API_SERVER="--api-servers=http://172.20.0.113:8080" # ## pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=jimmysong/pause-amd64:3.0" # ## Add your own! KUBELET_ARGS="--cgroup-driver=systemd --cluster-dns=10.254.0.2 --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --require-kubeconfig --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local --hairpin-mode promiscuous-bridge --serialize-image-pulls=false" ``` + 如果使用systemd方式啟動,則需要額外增加兩個參數`--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice` + `--experimental-bootstrap-kubeconfig` 在1.9版本已經變成了`--bootstrap-kubeconfig` + `--address` 不能設置為 `127.0.0.1`,否則后續 Pods 訪問 kubelet 的 API 接口時會失敗,因為 Pods 訪問的 `127.0.0.1` 指向自己而不是 kubelet; + 如果設置了 `--hostname-override` 選項,則 `kube-proxy` 也需要設置該選項,否則會出現找不到 Node 的情況; + `"--cgroup-driver` 配置成 `systemd`,不要使用`cgroup`,否則在 CentOS 系統中 kubelet 將啟動失敗(保持docker和kubelet中的cgroup driver配置一致即可,不一定非使用`systemd`)。 + `--experimental-bootstrap-kubeconfig` 指向 bootstrap kubeconfig 文件,kubelet 使用該文件中的用戶名和 token 向 kube-apiserver 發送 TLS Bootstrapping 請求; + 管理員通過了 CSR 請求后,kubelet 自動在 `--cert-dir` 目錄創建證書和私鑰文件(`kubelet-client.crt` 和 `kubelet-client.key`),然后寫入 `--kubeconfig` 文件; + 建議在 `--kubeconfig` 配置文件中指定 `kube-apiserver` 地址,如果未指定 `--api-servers` 選項,則必須指定 `--require-kubeconfig` 選項后才從配置文件中讀取 kube-apiserver 的地址,否則 kubelet 啟動后將找不到 kube-apiserver (日志中提示未找到 API Server),`kubectl get nodes` 不會返回對應的 Node 信息; `--require-kubeconfig` 在1.10版本被移除,參看[PR](https://github.com/kubernetes/kops/pull/4357/commits/30b10cb1c8c9d8d67fdf6371f1fda952a2b02004); + `--cluster-dns` 指定 kubedns 的 Service IP(可以先分配,后續創建 kubedns 服務時指定該 IP),`--cluster-domain` 指定域名后綴,這兩個參數同時指定后才會生效; + `--cluster-domain` 指定 pod 啟動時 `/etc/resolve.conf` 文件中的 `search domain` ,起初我們將其配置成了 `cluster.local.`,這樣在解析 service 的 DNS 名稱時是正常的,可是在解析 headless service 中的 FQDN pod name 的時候卻錯誤,因此我們將其修改為 `cluster.local`,去掉最后面的 ”點號“ 就可以解決該問題,關于 kubernetes 中的域名/服務名稱解析請參見我的另一篇文章。 + `--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用戶,對集群擁有所有權限。 + `KUBELET_POD_INFRA_CONTAINER` 是基礎鏡像容器,這里我用的是私有鏡像倉庫地址,**大家部署的時候需要修改為自己的鏡像**。我上傳了一個到時速云上,可以直接 `docker pull index.tenxcloud.com/jimmy/pod-infrastructure` 下載。`pod-infrastructure`鏡像是Redhat制作的,大小接近80M,下載比較耗時,其實該鏡像并不運行什么具體進程,可以使用Google的pause鏡像`gcr.io/google_containers/pause-amd64:3.0`,這個鏡像只有300多K,或者通過DockerHub下載`jimmysong/pause-amd64:3.0`。 完整 unit 見 [kubelet.service](../systemd/kubelet.service) ### 啟動kublet ``` bash systemctl daemon-reload systemctl enable kubelet systemctl start kubelet systemctl status kubelet ``` ### 通過kublet的TLS證書請求 kubelet 首次啟動時向 kube-apiserver 發送證書簽名請求,必須通過后 kubernetes 系統才會將該 Node 加入到集群。 查看未授權的 CSR 請求 ``` bash $ kubectl get csr NAME AGE REQUESTOR CONDITION csr-2b308 4m kubelet-bootstrap Pending $ kubectl get nodes No resources found. ``` 通過 CSR 請求 ``` bash $ kubectl certificate approve csr-2b308 certificatesigningrequest "csr-2b308" approved $ kubectl get nodes NAME STATUS AGE VERSION 10.64.3.7 Ready 49m v1.6.1 ``` 自動生成了 kubelet kubeconfig 文件和公私鑰 ``` bash $ ls -l /etc/kubernetes/kubelet.kubeconfig -rw------- 1 root root 2284 Apr 7 02:07 /etc/kubernetes/kubelet.kubeconfig $ ls -l /etc/kubernetes/ssl/kubelet* -rw-r--r-- 1 root root 1046 Apr 7 02:07 /etc/kubernetes/ssl/kubelet-client.crt -rw------- 1 root root 227 Apr 7 02:04 /etc/kubernetes/ssl/kubelet-client.key -rw-r--r-- 1 root root 1103 Apr 7 02:07 /etc/kubernetes/ssl/kubelet.crt -rw------- 1 root root 1675 Apr 7 02:07 /etc/kubernetes/ssl/kubelet.key ``` 假如你更新kubernetes的證書,只要沒有更新`token.csv`,當重啟kubelet后,該node就會自動加入到kuberentes集群中,而不會重新發送`certificaterequest`,也不需要在master節點上執行`kubectl certificate approve`操作。前提是不要刪除node節點上的`/etc/kubernetes/ssl/kubelet*`和`/etc/kubernetes/kubelet.kubeconfig`文件。否則kubelet啟動時會提示找不到證書而失敗。 **注意:**如果啟動kubelet的時候見到證書相關的報錯,有個trick可以解決這個問題,可以將master節點上的`~/.kube/config`文件(該文件在[安裝kubectl命令行工具](kubectl-installation.md)這一步中將會自動生成)拷貝到node節點的`/etc/kubernetes/kubelet.kubeconfig`位置,這樣就不需要通過CSR,當kubelet啟動后就會自動加入的集群中。 ## 配置 kube-proxy **安裝conntrack** ```bash yum install -y conntrack-tools ``` **創建 kube-proxy 的service配置文件** 文件路徑`/usr/lib/systemd/system/kube-proxy.service`。 ```ini [Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] EnvironmentFile=-/etc/kubernetes/config EnvironmentFile=-/etc/kubernetes/proxy ExecStart=/usr/local/bin/kube-proxy \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target ``` kube-proxy配置文件`/etc/kubernetes/proxy`。 ``` bash ### # kubernetes proxy config # default config should be adequate # Add your own! KUBE_PROXY_ARGS="--bind-address=172.20.0.113 --hostname-override=172.20.0.113 --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --cluster-cidr=10.254.0.0/16" ``` + `--hostname-override` 參數值必須與 kubelet 的值一致,否則 kube-proxy 啟動后會找不到該 Node,從而不會創建任何 iptables 規則; + kube-proxy 根據 `--cluster-cidr` 判斷集群內部和外部流量,指定 `--cluster-cidr` 或 `--masquerade-all` 選項后 kube-proxy 才會對訪問 Service IP 的請求做 SNAT; + `--kubeconfig` 指定的配置文件嵌入了 kube-apiserver 的地址、用戶名、證書、秘鑰等請求和認證信息; + 預定義的 RoleBinding `cluster-admin` 將User `system:kube-proxy` 與 Role `system:node-proxier` 綁定,該 Role 授予了調用 `kube-apiserver` Proxy 相關 API 的權限; 完整 unit 見 [kube-proxy.service](../systemd/kube-proxy.service) ### 啟動 kube-proxy ``` bash systemctl daemon-reload systemctl enable kube-proxy systemctl start kube-proxy systemctl status kube-proxy ``` ## 驗證測試 我們創建一個nginx的service試一下集群是否可用。 ```bash $ kubectl run nginx --replicas=2 --labels="run=load-balancer-example" --image=nginx --port=80 deployment "nginx" created $ kubectl expose deployment nginx --type=NodePort --name=example-service service "example-service" exposed $ kubectl describe svc example-service Name: example-service Namespace: default Labels: run=load-balancer-example Annotations: <none> Selector: run=load-balancer-example Type: NodePort IP: 10.254.62.207 Port: <unset> 80/TCP NodePort: <unset> 32724/TCP Endpoints: 172.30.60.2:80,172.30.94.2:80 Session Affinity: None Events: <none> $ curl "10.254.62.207:80" <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> ``` 訪問以下任何一個地址都可以得到nginx的頁面。 - 172.20.0.113:32724 - 172.20.0.114:32724 - 172.20.0.115:32724 ![nginx歡迎頁面](https://box.kancloud.cn/12522f4d9fb5126bc92527b2cb117b7b_2858x1414.png) ## 參考 - [Kubelet 的認證授權](../guide/kubelet-authentication-authorization.md)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看