5、部署 k8s Cluster(上)

5、部署 k8s Cluster(上)

咱們將部署三個節點的 Kubernetes Cluster。node

​ master 是 Master,node1 和 node2 是 Node。全部節點的操做系統均爲 Ubuntu 18.04,固然其餘 Linux 也是能夠的。官方安裝文檔能夠參考 https://kubernetes.io/docs/setup/independent/install-kubeadm/linux

​ 注意:Kubernetes 幾乎全部的安裝組件和 Docker 鏡像都放在 goolge 本身的網站上,這對國內的同窗多是個不小的障礙。建議是:網絡障礙都必須想辦法克服,否則連 Kubernetes 的門都進不了。docker

(一)安裝 Docker

​ 全部節點都須要安裝 Docker。參考:https://docs.docker.com/engine/install/ubuntu/數據庫

# step 1: 安裝必要的一些系統工具,安裝包,容許 apt 命令 HTTPS 訪問 Docker 源。
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟件源信息,將 Docker 的源添加到 /etc/apt/sources.list
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝Docker-CE
sudo apt-get -y update &&
 sudo apt-get install docker-ce docker-ce-cli containerd.io

(二)安裝 kubelet、kubeadm 和 kubectl

​ 在全部節點上安裝 kubelet、kubeadm 和 kubectl。bootstrap

​ kubelet 運行在 Cluster 全部節點上,負責啓動 Pod 和容器。ubuntu

​ kubeadm 用於初始化 Cluster。api

​ kubectl 是 Kubernetes 命令行工具。經過 kubectl 能夠部署和管理應用,查看各類資源,建立、刪除和更新各類組件。bash

apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF  
apt-get update
apt-get install -y kubelet kubeadm kubectl

(三)用 kubeadm 建立 Cluster

​ 完整的官方文檔能夠參考 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/網絡

(1)初始化 Master

​ 控制平面節點是運行控制平面組件的機器, 包括 etcd(集羣數據庫) 和 API Server(命令行工具 kubectl與之通訊)。app

1.(推薦)若是計劃將單個控制平面 kubeadm 集羣升級成高可用, 你應該指定 --control-plane-endpoint 爲全部控制平面節點設置共享端點。 端點能夠是負載均衡器的 DNS 名稱或 IP 地址。
2.選擇一個Pod網絡插件,並驗證是否須要爲 kubeadm init 傳遞參數。 根據你選擇的第三方網絡插件,你可能須要設置 --pod-network-cidr 的值。 請參閱 安裝Pod網絡附加組件。
3.(可選)從版本1.14開始,kubeadm 嘗試使用一系列衆所周知的域套接字路徑來檢測 Linux 上的容器運行時。 要使用不一樣的容器運行時, 或者若是在預配置的節點上安裝了多個容器,請爲 kubeadm init 指定 --cri-socket 參數。 請參閱安裝運行時。
4.(可選)除非另有說明,不然 kubeadm 使用與默認網關關聯的網絡接口來設置此控制平面節點 API server 的廣播地址。 要使用其餘網絡接口,請爲 kubeadm init 設置 --apiserver-advertise-address=<ip-address> 參數。 要部署使用 IPv6 地址的 Kubernetes 集羣, 必須指定一個 IPv6 地址,例如 --apiserver-advertise-address=fd00::101
5.(可選)在 kubeadm init 以前運行 kubeadm config images pull,以驗證與 gcr.io 容器鏡像倉庫的連通性。

關於 apiserver-advertise-address 和 ControlPlaneEndpoint 的注意事項:

--apiserver-advertise-address 可用於爲控制平面節點的 API server 設置廣播地址, --control-plane-endpoint 可用於爲全部控制平面節點設置共享端點。

--control-plane-endpoint 容許 IP 地址和能夠映射到 IP 地址的 DNS 名稱。 請與你的網絡管理員聯繫,以評估有關此類映射的可能解決方案。

​ 這是一個示例映射:

192.168.0.102 cluster-endpoint

​ 其中 192.168.0.102 是此節點的 IP 地址,cluster-endpoint 是映射到該 IP 的自定義 DNS 名稱。 這將容許你將 --control-plane-endpoint=cluster-endpoint 傳遞給 kubeadm init,並將相同的 DNS 名稱傳遞給 kubeadm join。 稍後你能夠修改 cluster-endpoint 以指向高可用性方案中的負載均衡器的地址。

kubeadm 不支持將沒有 --control-plane-endpoint 參數的單個控制平面集羣轉換爲高可用性集羣。

​ 關閉 SELinux:

# 臨時禁用selinux
# 永久關閉 修改/etc/sysconfig/selinux文件設置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
# 這裏按回車,下面是第二條命令
setenforce 0

​ 在 Master 上執行以下命令:

關閉swap:
swapoff  -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
全部節點,kubeadm初始化警告」cgroupfs「解決
vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
systemctl daemon-reload
systemctl restart docker
初始化master:
kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 10.0.0.41 --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address 指明用 Master 的哪一個 interface 與 Cluster 的其餘節點通訊。若是 Master 有多個 interface,建議明確指定,若是不指定,kubeadm 會自動選擇有默認網關的 interface。

--pod-network-cidr 指定 Pod 網絡的範圍。Kubernetes 支持多種網絡方案,並且不一樣網絡方案對 --pod-network-cidr 有本身的要求,這裏設置爲 10.244.0.0/16 是由於咱們將使用 flannel 網絡方案,必須設置成這個 CIDR。在後面的實踐中咱們會切換到其餘網絡方案,好比 Canal。

root@cuiyongchao:~# kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 10.0.0.41 --pod-network-cidr=10.244.0.0/16
W1101 09:18:28.676350   26460 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.19.3
[preflight] Running pre-flight checks          ---①
	[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key    ---②
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [cuiyongchao kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.0.0.41]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [cuiyongchao localhost] and IPs [10.0.0.41 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [cuiyongchao localhost] and IPs [10.0.0.41 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file    ---③
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 33.004269 seconds  ----④
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.19" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node cuiyongchao as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node cuiyongchao as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: krsig9.fnxqz4724vkrlevz
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy   ---⑤

Your Kubernetes control-plane has initialized successfully!   ---⑥

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config   ---⑦
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:   ---⑧
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.0.41:6443 --token krsig9.fnxqz4724vkrlevz \  ---⑨
    --discovery-token-ca-cert-hash sha256:cf41916f790097ac0619a837626caefb0ff5d926ea8e5cdedf5dbc1c80292fd1 
root@cuiyongchao:~#

① kubeadm 執行初始化前的檢查。

② 生成 token 和證書。

③ 生成 KubeConfig 文件,kubelet 須要這個文件與 Master 通訊。

④ 安裝 Master 組件,會從 goolge 的 Registry 下載組件的 Docker 鏡像,這一步可能會花一些時間,主要取決於網絡質量。

⑤ 安裝附加組件 kube-proxy 和 kube-dns。

⑥ Kubernetes Master 初始化成功。

⑦ 提示如何配置 kubectl,後面會實踐。

⑧ 提示如何安裝 Pod 網絡,後面會實踐。

⑨ 提示如何註冊其餘節點到 Cluster,後面會實踐。

(2)配置 kubectl

​ kubectl 是管理 Kubernetes Cluster 的命令行工具,前面咱們已經在全部的節點安裝了 kubectl。Master 初始化完成後須要作一些配置工做,而後 kubectl 就能使用了。依照 kubeadm init 輸出的第 ⑦ 步提示,推薦用 Linux 普通用戶執行 kubectl(root 會有一些問題)。

咱們爲 ubuntu 用戶配置 kubectl:

su - ubuntu 
rm -rf $HOME/.kube
sudo mkdir -p $HOME/.kube 
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

爲了使用更便捷,啓用 kubectl 命令的自動補全功能。

echo "source <(kubectl completion bash)" >> ~/.bashrc
這樣 ubuntu 用戶就能夠使用 kubectl 了。

這樣 ubuntu 用戶就能夠使用 kubectl 了。

相關文章
相關標籤/搜索