kubeadm是Kubernetes官方提供的用於快速安裝Kubernetes集羣的工具,經過將集羣的各個組件進行容器化安裝管理,經過kubeadm的方式安裝集羣比二進制的方式安裝要方便很多。html
安裝參考- https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/node
每個節點主機上包括master節點都要手動安裝並運行docker,同時也都要手動安裝並運行kubelet。若是將第一個節點初始化爲master節點,在執行初始化這個步驟,其實就是經過kubeadm工具將API Server、etcd、controller-manager、scheduler各組件運行爲Pod,也就是跑在docker上。而其餘node節點,因已經運行了kubelet、docker組件,剩下的kube-proxy組件也是要運行在Pod上。linux
kubeadmnginx
kubectlgit
kubeadmgithub
K8s Masterdocker
K8s Nodeshell
calicobootstrap
corednsubuntu
機器IP | 機器hostname | K8s集羣角色 | 機器操做系統 |
---|---|---|---|
172.20.249.16 | 172-20-249-16 | master | ubuntu16.04 |
172.20.249.17 | 172-20-249-17 | node | ubuntu16.04 |
172.20.249.18 | 172-20-249-18 | node | ubuntu16.04 |
使用以下命令設置hostname: (非必須)
# 172.20.249.16 hostnamectl --static set-hostname k8s-master # 172.20.249.17 hostnamectl --static set-hostname k8s-node-01 # 172.20.249.18 hostnamectl --static set-hostname k8s-node-02
Kubernetes v1.8+ 要求關閉系統 Swap,請在全部節點利用如下指令關閉 (不然kubelet會出錯!)
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab
# step 1: 安裝必要的一些系統工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安裝GPG證書 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # Step 3: 寫入軟件源信息 sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新並安裝 Docker-CE (可指定版本) sudo apt-get -y update sudo apt-get -y install docker-ce sudo apt-get -y install docker-ce=17.03.0~ce-0~ubuntu-xenial
apt-get update && apt-get install -y apt-transport-https # 安裝 GPG 證書 curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - # 寫入軟件源;注意:咱們用系統代號爲 bionic,但目前阿里雲不支持,因此沿用 16.04 的 xenial 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 # 指定版本 apt-get install -y kubelet=1.18.8-00 kubeadm=1.18.8-00 kubectl=1.18.8-00
kubeadm是一個構建k8s集羣的工具。它提供的kubeadm init
和 kubeadm join
兩個命令是快速構建k8s集羣的最佳實踐。 其次,kubeadm工具只爲構建最小可用集羣,它只關心集羣中最基礎的組件,至於其餘的插件(好比dashboard、CNI等)則不會涉及
kubeadm init to bootstrap the initial Kubernetes control-plane node.
kubeadm join to bootstrap a Kubernetes worker node or an additional control plane node, and join it to the cluster.
kubeadm upgrade to upgrade a Kubernetes cluster to a newer version.
kubeadm reset to revert any changes made to this host by kubeadm init or kubeadm join.
更多瞭解 kubeadm - http://www.javashuo.com/article/p-tjraeelm-nx.html
kubeadm 初始化整個集羣的過程,會生成相關的各類證書、kubeconfig 文件、bootstraptoken 等等
注意: 若是使用直接使用kubeadm init
,會使用默認配置(以下)
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
可打印默認配置
apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 1.2.3.4 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: k8s-master taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: k8s.gcr.io # 默認狀況下kubeadm會到k8s.gcr.io拉取鏡像,不過對於一些私有化部署(好比國內存在牆的狀況下,上面的地址是訪問不到的),就須要自定義鏡像地址了 如: imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.18.0 networking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 # 添加該配置 serviceSubnet: 10.96.0.0/12 scheduler: {}
修改配置文件後, 執行命令 kubeadm init --config kubeadm.yml
便可
或者 直接傳遞參數執行 (以下)
kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 #選擇flannel做爲 Pod 的網絡插件,因此須要指定 --pod-network-cidr=10.244.0.0/16 #選擇flannel做爲 Pod 的網絡插件,因此須要指定 --pod-network-cidr=192.168.0.0/16
參數說明:
--apiserver-advertise-address:這個參數指定了監聽的API地址。若沒有設置,則使用默認網絡接口。 --apiserver-bind-port:這個參數指定了API服務器暴露出的端口號,默認是6443 --kubernetes-version:指定kubeadm安裝的kubernetes版本。這個是很重要的,由於默認狀況下kubeadm會安裝與它版本相同的kubernetes版本 --image-repository 能夠指定國內的鏡像倉庫。 默認k8s.gcr.io 國內沒法訪問 -- token-ttl:令牌被刪除前的時間,默認是24h。kubeadm初始化完畢後會生成一個令牌,讓其餘節點可以加入集羣,過期以後這個令牌會自動刪除。若是設置爲0以後令牌就永不過時
以下所示,kubeadm init
會 pull 必要的鏡像,可能時間會比較長 (kubeadm config images pull
可測試是否能夠拉取鏡像,若是加了 --image-repository registry.aliyuncs.com/google_containers
,不會擔憂在國內拉取鏡像問題)
user@k8s-master:~$ kubeadm config images list k8s.gcr.io/kube-apiserver:v1.18.9 k8s.gcr.io/kube-controller-manager:v1.18.9 k8s.gcr.io/kube-scheduler:v1.18.9 k8s.gcr.io/kube-proxy:v1.18.9 k8s.gcr.io/pause:3.2 k8s.gcr.io/etcd:3.4.3-0 k8s.gcr.io/coredns:1.6.7
init 完後,能夠看到以下提示:
按照提示在 master 節點執行如下命令: (不然會出錯)
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
此時, master 處於ready
狀態
NAME STATUS ROLES AGE VERSION k8s-master Ready master 14m v1.18.6
拷貝在 master 節點 init 後的 join 命令,在其餘兩個 worker 節點執行:
kubeadm join 172.20.249.16:6443 --token cma8ob.ow9sfv5erqgkkp30 \ --discovery-token-ca-cert-hash sha256:def379576eacaddbb4bbf4ca12fbb8a0b77383e4521cbf238f21c8dd3cb80fab
能夠看到該節點已經加入到集羣中去了,而後咱們把 master 節點的~/.kube/config文件拷貝到當前節點對應的位置便可使用 kubectl 命令行工具了。
mkdir -p $HOME/.kube # copy master "/etc/kubernetes/admin.conf" sudo scp root@172.20.249.16:/etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
要注意將上面的加入集羣的命令保存下面,若是忘記,可使用如下命令獲取
kubeadm token create --print-join-command
在 master 節點查看集羣狀況,能夠看到節點的 status 仍是 NotReady,這是因爲尚未網絡插件。
以 flannel插件 爲例,在 master 節點 執行
#For Kubernetes v1.7+ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml
Calico插件- 參考 https://docs.projectcalico.org/getting-started/kubernetes/quickstart
等待全部的 pod 都是 running 狀態,能夠看到全部 node 的 status 是 running 的狀態,這時 kubernetes 集羣就搭建好了。
至此3個節點的集羣搭建完成,後續能夠繼續添加node節點,或者部署dashboard、helm包管理工具、EFK日誌系統、Prometheus Operator監控系統、rook+ceph存儲系統等組件
kubectl create -f nginx-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: selector: matchLabels: app: nginx replicas: 3 strategy: type: RollingUpdate template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
發佈服務,暴露端口
kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer