k8s組件
master,node
master中包括apiserver,scheduler,controller。etcd
apiserver:負責接收用戶請求,並且保存至etcd中。
scheduler:負責將apisever中創建的資源根據node的負載情況調度至其他node
controller:負責監控apiserver中用戶期望創建資源的狀態。如果當前狀態與期望狀態不同,controller就會試圖將資源重啟或者刪除重建。和拉取容器鏡像
etcd:用於保存k8s cluster中的所有配置信息
node節點:kubelet,kube-proxy,docker,pod
docker/容器引擎:運行pod時容器引擎
kubelet:相當於agent,會watch着apiserver中的資源變動,一旦資源跟自己節點有關,則執行調動docker引擎。拉取鏡像。創建容器
pod:k8s中的核心基本單元。一個pod中可以存在多個容器。一個pod共享同一組網絡空間。IPC。等
kube-proxy:
ADDONS插件:
DNS:用於服務注冊服務發現
CNI:容器網絡插件。包括(flannel,calico)
k8s中常用的資源類型:Pod,Service,Namespace,Volume。控制器對象。ReplicaSet,deployment,DaemonSet,StatefulSet。等等
使用kubeadm容器化部署k8s
設定時鍾同步
若節點可直接訪問互聯網,直接啟動chronyd系統服務,並設定其隨系統引導而啟動。
~]# systemctl start chronyd.service
~]# systemctl enable chronyd.service
關閉iptables或firewalld服務
關閉並禁用SELinux
若當前啟用了SELinux,則需要編輯/etc/sysconfig/selinux文件,禁用SELinux,並臨時設置其當前狀態為permissive:
~]# sed -i 's@^\(SELINUX=\).*@\1disabled@' /etc/sysconfig/selinux
~]# setenforce 0
禁用Swap設備
部署集群時,kubeadm默認會預先檢查當前主機是否禁用了Swap設備,並在未禁用時強制終止部署過程。因此,在主機內存資源充裕的條件下,需要禁用所有的Swap設備,否則,就需要在后文的kubeadm init及kubeadm join命令執行時額外使用相關的選項忽略檢查錯誤。
關閉Swap設備,需要分兩步完成。首先是關閉當前已啟用的所有Swap設備:
~]# swapoff -a
而后編輯/etc/fstab配置文件,注釋用於掛載Swap設備的所有行
啟用ipvs內核模塊
創建內核模塊載入相關的腳本文件/etc/sysconfig/modules/ipvs.modules,設定自動載入的內核模塊。文件內容如下:
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for mod in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
/sbin/modinfo -F filename $mod &> /dev/null
if [ $? -eq 0 ]; then
/sbin/modprobe $mod
fi
done
修改文件權限,並手動為當前系統加載內核模塊:
~]# chmod +x /etc/sysconfig/modules/ipvs.modules
~]# bash /etc/sysconfig/modules/ipvs.modules
**二、安裝程序包(在各主機上完成如下設定) **
1、生成yum倉庫配置
首先獲取docker-ce的配置倉庫配置文件:
~]# wwget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo
而后手動生成kubernetes的yum倉庫配置文件/etc/yum.repos.d/kubernetes.repo,內容如下:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enabled=1
2、安裝相關的程序包
Kubernetes會對經過充分驗正的Docker程序版本進行認證,目前認證完成的最高版本是17.03,但docker-ce的最新版本已經高出了幾個版本號。管理員可忽略此認證而直接使用最新版本的docker-ce程序,不過,建議根據后面的說明,將安裝命令替換為安裝17.03版。
~]# yum install docker-ce -y
~]# yum install kubelet kubeadm kubectl -y
三、啟動docker服務(在各節點執行)
另外,docker自1.13版起會自動設置iptables的FORWARD默認策略為DROP,這可能會影響Kubernetes集群依賴的報文轉發功能,因此,需要在docker服務啟動后,重新將FORWARD鏈的默認策略設備為ACCEPT,方式是修改/usr/lib/systemd/system/docker.service文件,在“ExecStart=/usr/bin/dockerd”一行之后新增一行如下內容:
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
重載完成后即可啟動docker服務:
~]#systemctl daemon-reload
~]# systemctl start docker.service
而后設定docker和kubelet隨系統引導自動啟動:
~]# systemctl enable docker kubelet
四、初始化主節點(在master上完成如下操作)
1、初始化master節點
若未禁用Swap設備,則需要編輯kubelet的配置文件/etc/sysconfig/kubelet,設置其忽略Swap啟用的狀態錯誤,內容如下:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
(可選步驟)而后,在運行初始化命令之前先運行如下命令單獨獲取相關的鏡像文件,而后再運行后面的kubeadm init命令,以便於觀察到鏡像文件的下載過程。
~]# kubeadm config images pull
初始化方式一:
運行如下命令完成master01節點的初始化:
~]# kubeadm init --kubernetes-version=v1.16.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --image-repository gcr.azk8s.cn/google_containers
命令中的各選項簡單說明如下:
(1) --kubernetes-version選項的版本號用於指定要部署的Kubenretes程序版本,它需要與當前的kubeadm支持的版本保持一致;
(2) --pod-network-cidr選項用於指定分Pod分配使用的網絡地址,它通常應該與要部署使用的網絡插件(例如flannel、calico等)的默認設定保持一致,10.244.0.0/16是flannel默認使用的網絡;
(3) --service-cidr用於指定為Service分配使用的網絡地址,它由kubernetes管理,默認即為10.96.0.0/12;
(4) 最后一個選項“--ignore-preflight-errors=Swap”僅應該在未禁用Swap設備的狀態下使用。
(5) --image-repository gcr.azk8s.wcn/google_containers 更改默認的鏡像倉庫指定為國內鏡像
初始化方式二:
kubeadm也可通過配置文件加載配置,以定制更豐富的部署選項。以下是個符合前述命令設定方式的使用示例,不過,它明確定義了kubeProxy的模式為ipvs,並支持通過修改imageRepository的值修改獲取系統鏡像時使用的鏡像倉庫。
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.13.3
api:
advertiseAddress: 172.20.0.71
bindPort: 6443
controlPlaneEndpoint: ""
imageRepository: k8s.gcr.io
kubeProxy:
config:
mode: "ipvs"
ipvs:
ExcludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kubeletConfiguration:
baseConfig:
cgroupDriver: cgroupfs
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
failSwapOn: false
resolvConf: /etc/resolv.conf
staticPodPath: /etc/kubernetes/manifests
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
將上面的內容保存於配置文件中,例如kubeadm-config.yaml,而后執行相應的命令:
~]# kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=Swap
注意:對於Kubernetes系統的新用戶來說,無論使用上述哪種方法,命令運行結束后,請記錄最后的kubeadm join命令輸出的最后提示的操作步驟。下面的內容是需要用戶記錄的一個命令輸出示例,它提示了后續需要的操作步驟:
2、初始化kubectl
kubectl是kube-apiserver的命令行客戶端程序,實現了除系統部署之外的幾乎全部的管理操作,是kubernetes管理員使用最多的命令之一。kubectl需經由API server認證及授權后方能執行相應的管理操作,kubeadm部署的集群為其生成了一個具有管理員權限的認證配置文件/etc/kubernetes/admin.conf,它可由kubectl通過默認的“$HOME/.kube/config”的路徑進行加載。當然,用戶也可在kubectl命令上使用--kubeconfig選項指定一個別的位置。
下面復制認證為Kubernetes系統管理員的配置文件至目標用戶(例如當前用戶root)的家目錄下:
~]# mkdir ~/.kube
~]# cp /etc/kubernetes/admin.conf ~/.kube/config
而后,即可通過kubectl進行客戶端命令測試,並借此了解集群組件的當前狀態:
~]# kubectl get componentstatus
一個正常的輸出應該類似如下輸出結果所示:
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
node節點拉取鏡像
docker image pull gcr.azk8s.cn/google_containers/kube-proxy:v1.16.3 && docker image pull gcr.azk8s.cn/google_containers/pause:3.1 && docker image pull quay.io/coreos/flannel:v0.11.0-amd64
3、添加flannel網絡附件
Kubernetes系統上Pod網絡的實現依賴於第三方插件進行,這類插件有近數十種之多,較為著名的有flannel、calico、canal和kube-router等,簡單易用的實現是為CoreOS提供的flannel項目。下面的命令用於在線部署flannel至Kubernetes系統之上:
~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
而后使用如下命令確認其輸出結果中Pod的狀態為“Running”,類似如下所示:
~]# kubectl get pods -n kube-system -l app=flannel
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-amd64-wscnz 1/1 Running 0 14m
五、添加節點到集群中(在node01和node02上分別完成如下操作)
1、若未禁用Swap設備,編輯kubelet的配置文件/etc/sysconfig/kubelet,設置其忽略Swap啟用的狀態錯誤,內容如下:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
kubeadm join 192.168.1.195:6443 --token b3agph.vszgxzb76lneyob5
--discovery-token-ca-cert-hash sha256:19fcd3a8494247f8f12ce17fb65620853301cb07662c2f56c627075d4dbdc3db
部署完成