k8s 核心架構:https://www.kubernetes.org.cn/4291.html
k8s 高可用2個核心 apiserver master 和 etcd
etcd:(需高可用)集羣的數據中心,用於存放集羣的配置以及狀態信息,非常重要,如果數據丟失那麼集羣將無法恢復;因此高可用集羣部署首先就是etcd是高可用集羣;
Apiserver:提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制。整個集羣中其他角色只有通過Apiserver才能訪問etcd。CLI工具kubectl也是通過apiserver來對整體集羣進行訪問控制。
Controller-manager:負責維護集羣的狀態,比如故障檢測、自動擴展、滾動更新等。一組k8s master上同一時間只有一個controller-manager角色進行工作,因爲要避免控制衝突。
Scheduler:負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上。一組k8s master上同一時間只有一個scheduler角色進行工作,同樣因爲要避免控制衝突。
Kubelet:負責pod對應的容器的創建、啓停等任務,同時也負責Volume(CVI)和網絡(CNI)的管理。
kube-proxy: 每個node上一個,負責service vip到endpoint pod的流量轉發和負載均衡,老版本主要通過設置iptables規則實現,新版1.9基於kube-proxy-lvs 實現
訪問部署在kubernetes集羣中服務,有兩種類型:
集羣內部實現訪問
集羣外部實現訪問
但是不管是集羣內部還是外部訪問都是要經過kube-proxy的
環境初始化
1.安裝之前關閉所有節點的防火牆和selinux
systemctl stop firewalld
systemctl disable firewalld
[root@test ~]# getenforce
Disabled
master | 172.20.103.1 |
node | 172.20.103.2 |
node | 172.20.103.3 |
master上部署的服務:etcd、kube-apiserver、kube-controller-manager、kube-scheduler
etcd服務:見筆記(etcd高可用集羣)
etcd服務作爲k8s集羣的主數據庫,在安裝k8s各服務之前需要首先安裝和啓動
Master安裝:
下載最新的二進制版本kubernetes-server-linux-amd64.tar.gz並解壓縮,然後在解壓縮文件中,找到./kubernetes/server/bin包含所有必需的二進制文件的文件。
如果用https協議下載報錯,可以用http方式連接,使用“--no-check-certificate”
wget https://storage.googleapis.com/kubernetes-release/release/v1.14.2/kubernetes-server-linux-amd64.tar.gz
tar -zxf kubernetes-server-linux-amd64.tar.gz
cd /opt/kubernetes/server/bin
cp kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/bin/
創建master端主配置文件:
創建存放配置文件的目錄
mkdir -p /etc/kubernetes
mkdir -p /etc/kubernetes/logs
kube-apiserver 服務
創建kube-apiserver的systemd配置文件:vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=etcd.service
Wants=etcd.service
[Service]
EnvironmentFile=-/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件/etc/kubernetes/apiserver的內容包括了kube-apiserver的全部啓動參數,主要的配置參數在變量KUBE_API_ARGS中指定。
vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range=169.169.0.0/16 --service-node-port-range=1-65535 --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota --logtostderr=false --log-dir=/etc/kubernetes/logs --v=0"
啓動參數說明如下:
--storage-backend:指定etcd的版本,從k8s1.6開始,默認爲etcd3。在1.6之前的版本中沒有這個參數,kube-apiserver默認使用etcd2。
--etcd-servers:指定etcd服務的URL
--insecure-bind-address:api server綁定主機的非安全IP地址,設置0.0.0.0表示綁定所有IP地址
--insecure-port:api server綁定主機的非安全端口號,默認爲8080
--service-cluster-ip-range:k8s集羣中service的虛擬IP地址範圍,該IP範圍不能與物理機的IP地址有重合。以CIDR格式表示,例如169.169.0.0/16 。
--service-node-port-range:k8s集羣中service可使用的物理機端口號範圍,默認值30000~32767。
--enable-admission-plugins:k8s集羣的准入控制設置,各控制模塊以插件的形式依次生效。
--logtostderr:設置爲false表示將日誌寫入文件,不寫入stderr。
--log-dir:日誌目錄
--v:日誌級別
kube-controller-manager 服務
kube-controller-manager服務依賴於kube-apiserver服務
創建kube-controller-manager的systemd配置文件:vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件/etc/kubernetes/controller-manager的內容包含了kube-controller-manager的全部啓動參數,主要的配置參數在變量KUBE_CONTROLLER_MANAGER_ARGS中指定:
vim /etc/kubernetes/controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/etc/kubernetes/logs --v=0"
啓動參數說明如下:
--kubeconfig:設置與api server 連接的相關配置,vim /etc/kubernetes/kubeconfig
apiVersion: v1
kind: Config
users:
- name: client
clusters:
- name: default
cluster:
server: http://api_server_ip:8080
contexts:
- context:
cluster: default
user: client
name: default
current-context: default
--logtostderr:設置爲false表示將日誌寫入文件,不寫入stderr。
--log-dir:日誌目錄
--v:日誌級別
kube-scheduler 服務
kube-scheduler 服務也依賴於kube-apiserver服務
創建kube-scheduler的systemd配置文件:vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler Plugin
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件/etc/kubernetes/scheduler 的內容包含了kube-scheduler 的全部啓動參數,主要的配置參數在變量KUBE_SCHEDULER_ARGS 中指定:
vim /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/etc/kubernetes/logs --v=0"
啓動參數說明如下:
--kubeconfig:設置與api server 連接的相關配置,可以與kube-controller-manager使用的kubeconfig 文件相同。
--logtostderr:設置爲false表示將日誌寫入文件,不寫入stderr。
--log-dir:日誌目錄
--v:日誌級別
啓動服務
搭建完成之後先啓動etcd然後在啓動其他服務,執行systemctl start 命令按順序啓動這3個服務,同時使用systemctl enable命令將服務加入開機啓動列表中。
systemctl daemon-reload
systemctl enable kube-apiserver kube-controller-manager kube-scheduler
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
查看服務啓動狀態
systemctl status kube-apiserver kube-controller-manager kube-scheduler
至此,kubernetes master上所需的服務就全部啓動完成了。
如果搭建集羣,我們在三臺master主機上重複以上搭建步驟,注意配置文件中需要修改IP地址的地方,以及需要先啓動etcd,然後依次啓動kube-apiserver,kube-controller-manager,kube-scheduler。
驗證master上組件健康:kubectl get cs
[root@test ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
Node上部署的服務:kubelet、kube-proxy、flannel(網絡組建)
在node上需要預先安裝好docker,先別啓動,等配置好fannel之後再啓動。
yum -y install docker
yum -y install flannel
編輯配置文件 vim /etc/sysconfig/flanneld 設置etcd的url地址
FLANNEL_ETCD_ENDPOINTS="http://172.20.103.1:2379" #flannel從etcd中讀取配置
FLANNEL_ETCD_PREFIX="/coreos.com/network" #/coreos.com/network 是master端etcd網絡授權的文件,這個需要在啓動flanneld之前在master端手動生成
在啓動flanneld 服務之前,需要在master端etcd中添加一條網絡配置記錄,這個配置將用於flanneld分配給每個docker的虛擬ip地址段。
etcdctl set /coreos.com/network/config '{"Network":"10.10.0.0/16"}'
查看是否添加成功
etcdctl get /coreos.com/network/config
由於flannel將覆蓋docker0網橋,所以如果docker服務已經啓動,則需要先停止docker服務。
systemctl enable flanneld
systemctl start flanneld
systemctl enable docker
我們可以在etcd中查看flannel設置的地址與物理機IP地址的對應規則:
etcdctl ls /coreos.com/network/subnets
etcdctl get /coreos.com/network/subnets/10.10.92.0-24
tar -zxf kubernetes-server-linux-amd64.tar.gz
cd /opt/kubernetes/server/bin
cp kubelet kube-proxy /usr/bin/
創建Node端主配置文件
創建存放配置文件的目錄
mkdir -p /etc/kubernetes
mkdir -p /etc/kubernetes/logs
kubelet服務
kubelet是Master在Node節點上的Agent,管理本機運行容器的生命週期,比如創建容器、 Pod掛載數據卷、下載secret、獲取容器和節點狀態等工作。 kubelet將每個Pod轉換成一組容器。
kube-proxy在Node節點上實現Pod網絡代理,維護網絡規則和四層負載均衡工作。
kubelet服務依賴於docker 服務
創建kubelet的systemd 服務配置文件 vim /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
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=on-failure
[Install]
WantedBy=multi-user.target
其中,WorkingDirectory 表示kubelet保存數據的目錄,需要在啓動kubelet 服務之前創建。
mkdir -p /var/lib/kubelet
配置文件/etc/kubernetes/kubelet 的內容包含了kubelet 的全部啓動參數,主要的配置參數在變量KUBELET_ARGS 中指定:
vim /etc/kubernetes/kubelet
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --fail-swap-on=false --cgroup-driver=systemd --hostname-override=172.20.103.2 --logtostderr=false --log-dir=/etc/kubernetes/logs --v=0"
啓動參數說明如下:
--kubeconfig:設置與api server 連接的相關配置,可以與kube-controller-manager使用的kubeconfig 文件相同。
--fail-swap-on=false:設置爲true表示如果主機啓用了swap,kubelet組件將無法啓動,默認值爲true。Kubernetes v1.8+ 要求關閉系統 Swap,若不關閉則需要修改kubelet設定參數。
--cgroup-driver=systemd:用於操作本機cgroup的驅動模式,支持groupfs或者systemd,默認值爲cgroupfs。docker使用的文件驅動默認systemd, 兩邊不一致會導致kubelet組件無法啓動。
vim /etc/kubernetes/kubeconfig
apiVersion: v1
kind: Config
users:
- name: client
clusters:
- name: default
cluster:
server: http://api_server_ip:8080
contexts:
- context:
cluster: default
user: client
name: default
current-context: default
--hostname-override:設置本node的名稱
--logtostderr:設置爲false表示將日誌寫入文件,不寫入stderr。
--log-dir:日誌目錄
--v:日誌級別
kube-proxy 服務
kube-proxy 服務依賴於network 服務
創建kube-proxy的systemd配置文件 vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
Requires=network.service
[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件/etc/kubernetes/proxy內容包括了kube-proxy的全部啓動參數,主要的配置參數在變量 KUBE_PROXY_ARGS 中指定。
vim /etc/kubernetes/proxy
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/etc/kubernetes/logs --v=2"
啓動參數說明如下:
--kubeconfig:設置與api server 連接的相關配置,可以與kube-controller-manager使用的kubeconfig 文件相同。
--logtostderr:設置爲false表示將日誌寫入文件,不寫入stderr。
--log-dir:日誌目錄
--v:日誌級別
配置完成後,啓動服務
systemctl daemon-reload
systemctl enable kubelet kube-proxy
systemctl start kubelet kube-proxy
systemctl status kubelet kube-proxy
kubelet 默認採用向master自動註冊本node的機制,在master上查看各node的狀態,狀態爲ready表示node已經成功註冊並且狀態爲可用:
kubectl get nodes