二進制安裝k8s v1.14.2版本

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 masteretcd網絡授權的文件,這個需要在啓動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

spacer.gif

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章