k8s 核心架構:https://www.kubernetes.org.cn/4291.htmlhtml
k8s 高可用2個核心 apiserver master 和 etcdnode
etcd:(需高可用)集羣的數據中心,用於存放集羣的配置以及狀態信息,很是重要,若是數據丟失那麼集羣將沒法恢復;所以高可用集羣部署首先就是etcd是高可用集羣;linux
Apiserver:提供了資源操做的惟一入口,並提供認證、受權、訪問控制、API註冊和發現等機制。整個集羣中其餘角色只有經過Apiserver才能訪問etcd。CLI工具kubectl也是經過apiserver來對總體集羣進行訪問控制。git
Controller-manager:負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等。一組k8s master上同一時間只有一個controller-manager角色進行工做,由於要避免控制衝突。github
Scheduler:負責資源的調度,按照預約的調度策略將Pod調度到相應的機器上。一組k8s master上同一時間只有一個scheduler角色進行工做,一樣由於要避免控制衝突。docker
Kubelet:負責pod對應的容器的建立、啓停等任務,同時也負責Volume(CVI)和網絡(CNI)的管理。數據庫
kube-proxy: 每一個node上一個,負責service vip到endpoint pod的流量轉發和負載均衡,老版本主要經過設置iptables規則實現,新版1.9基於kube-proxy-lvs 實現vim
訪問部署在kubernetes集羣中服務,有兩種類型:api
集羣內部實現訪問安全
集羣外部實現訪問
可是不論是集羣內部仍是外部訪問都是要通過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