1. 程式人生 > >CentOS 7.5 使用 yum 源安裝 Kubernetes 叢集(二)

CentOS 7.5 使用 yum 源安裝 Kubernetes 叢集(二)

一、安裝方式介紹

1、yum 安裝

目前CentOS官方已經把Kubernetes源放入到自己的預設 extras 倉庫裡面,使用 yum 安裝,好處是簡單,壞處也很明顯,需要官方更新 yum 源才能獲得最新版本的軟體,而所有軟體的依賴又不能自己指定,尤其是你的作業系統版本如果低的話,使用 yum 源安裝的 Kubernetes 的版本也會受到限制,通常會低於官方很多版本,我安裝的時候目前官方版本為1.12,而 yum 源中的版本為1.5.2

2、二進位制安裝

使用二進位制檔案安裝,好處是可以安裝任意版本的 Kubernetes,壞處是配置比較複雜,很多軟體包因為一些原因,我們在大陸是訪問不到的。

3、Kubeadm 安裝

kubeadm 是 Kubernetes 官方提供的用於快速安裝 Kubernetes 叢集的工具,伴隨Kubernetes每個版本的釋出都會同步更新,kubeadm會對叢集配置方面的一些實踐做調整,通過實驗 kubeadm 可以學習到 Kubernetes 官方在叢集配置上一些新的最佳實踐。

1.4 版本對於Linux主要發行版本Ubuntu Xenial和Red Hat centos7的使用者,可以使用熟悉的 apt-get 和 yum 來直接安裝 Kubernetes。再比如,1.4版本引入了 kubeadm 命令,將叢集啟動簡化為兩條命令,不需要再使用複雜的kube-up指令碼。

Kubernetes 的官方文件更新的速度太快了,我們注意到在 Kubernetes 1.9 的文件Using kubeadm to Create a Cluster中已經給出了目前1.9的 kubeadm 的主要特性已經處於beta狀態了,在2018年將進入GA狀態,說明kubeadm離可以在生產環境中使用的距離越來越近了,這也是我們以後注意使用的安裝方式,但是為了瞭解其中的安裝過程,我們先從其他兩種安裝方式入手。

這裡我們選用第一種方式安裝。

二、主要元件說明

1、Master元件

Master元件提供叢集的管理控制中心。

Master元件可以在叢集中任何節點上執行。但是為了簡單起見,通常在一臺VM/機器上啟動所有Master元件,並且不會在此VM/機器上執行使用者容器

kube-apiserver
kube-apiserver用於暴露Kubernetes API。任何的資源請求/呼叫操作都是通過kube-apiserver提供的介面進行。

ETCD
etcd是Kubernetes提供預設的儲存系統,儲存所有叢集資料,使用時需要為etcd資料提供備份計劃。

kube-controller-manager
kube-controller-manager執行管理控制器,它們是叢集中處理常規任務的後臺執行緒。邏輯上,每個控制器是一個單獨的程序,但為了降低複雜性,它們都被編譯成單個二進位制檔案,並在單個程序中執行。

這些控制器包括:

  • 節點(Node)控制器。
  • 副本(Replication)控制器:負責維護系統中每個副本中的pod。
  • 端點(Endpoints)控制器:填充Endpoints物件(即連線Services&Pods)。
  • Service Account和Token控制器:為新的Namespace 建立預設帳戶訪問API Token。

cloud-controller-manager
雲控制器管理器負責與底層雲提供商的平臺互動。雲控制器管理器是Kubernetes版本1.6中引入的,目前還是Alpha的功能。

雲控制器管理器僅運行雲提供商特定的(controller loops)控制器迴圈。可以通過將--cloud-provider flag設定為external啟動kube-controller-manager ,來禁用控制器迴圈。

cloud-controller-manager 具體功能:

  1. 節點(Node)控制器
  2. 路由(Route)控制器
  3. Service控制器
  4. 卷(Volume)控制器

kube-scheduler
kube-scheduler 監視新建立沒有分配到Node的Pod,為Pod選擇一個Node。

2、Node 元件

kubelet
kubelet是主要的節點代理,它會監視已分配給節點的pod,具體功能:

  • 安裝Pod所需的volume。
  • 下載Pod的Secrets。
  • Pod中執行的 docker(或experimentally,rkt)容器。
  • 定期執行容器健康檢查。
  • Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.
  • Reports the status of the node back to the rest of the system.

kube-proxy
kube-proxy通過在主機上維護網路規則並執行連線轉發來實現Kubernetes服務抽象。

docker
docker用於執行容器。

flannel
Flannel 是 CoreOS 團隊針對 Kubernetes 設計的一個覆蓋網路(Overlay Network)工具,需要另外下載部署。我們知道當我們啟動 Docker 後會有一個用於和容器進行互動的 IP 地址,如果不去管理的話可能這個 IP 地址在各個機器上是一樣的,並且僅限於在本機上進行通訊,無法訪問到其他機器上的 Docker 容器。Flannel 的目的就是為叢集中的所有節點重新規劃 IP 地址的使用規則,從而使得不同節點上的容器能夠獲得同屬一個內網且不重複的 IP 地址,並讓屬於不同節點上的容器能夠直接通過內網 IP 通訊。

三、環境準備

1、節點準備

IP 角色 備註
172.18.8.200 master:kubernetes-master,etcd CentOS7.5最小化安裝
172.18.8.201 node01:kubernetes-node,flannel,docker CentOS7.5最小化安裝
172.18.8.202 node02:kubernetes-node,flannel,docker CentOS7.5最小化安裝

節點及網路規劃圖如下:

CentOS 7.5 使用 yum 源安裝 Kubernetes 叢集(二)

2、現在倉庫中的版本

軟體 版本
kubernetes-master 1.5.2-0.7.git269f928.el7
kubernetes-node 1.5.2-0.7.git269f928.el7
CentOS 7.5 CentOS Linux release 7.5.1804
etcd 3.2.22-1.el7
flannel 0.7.1-4.el7

3、主機名和解析

修改檔案/etc/hostname
編輯檔案/etc/hosts,增加如下內容,

172.18.8.200 master.wzlinux.com master
172.18.8.201 node01.wzlinux.com node01
172.18.8.202 node02.wzlinux.com node02

4、關閉防火牆

systemctl stop firewalld.service
systemctl disable firewalld.service

四、系統倉庫yum安裝

1、master節點安裝

yum install kubernetes-master etcd -y

2、node節點安裝

yum install kubernetes-node flannel docker -y

五、叢集配置

1、配置etcd(matser)

  • 在master節點上編輯檔案/etc/etcd/etcd.conf,修改為如下內容,主要是修改監聽IP:
[[email protected] ~]# cat /etc/etcd/etcd.conf
#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="default"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[Security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_AUTO_TLS="false"
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#ETCD_PEER_AUTO_TLS="false"
#
#[Logging]
#ETCD_DEBUG="false"
#ETCD_LOG_PACKAGE_LEVELS=""
#ETCD_LOG_OUTPUT="default"
#
#[Unsafe]
#ETCD_FORCE_NEW_CLUSTER="false"
#
#[Version]
#ETCD_VERSION="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"
#
#[Profiling]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"
  • 啟動並校驗。
systemctl start etcd
systemctl enable etcd
systemctl status etcd

若要部署多節點叢集也比較簡單,參見 https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/clustering.md
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS:該成員節點在整個叢集中的通訊地址列表,這個地址用來傳輸叢集資料的地址。因此這個地址必須是可以連線叢集中所有的成員的。
ETCD_INITIAL_CLUSTER:配置叢集內部所有成員地址。

2、配置apiserver(master)

  • 編輯檔案/etc/kubernetes/apiserver,修改為如下,注意KUBE_ADMISSION_CONTROL引數:
[[email protected] ~]# cat /etc/kubernetes/apiserver
###
# kubernetes system config
#
# The following values are used to configure the kube-apiserver
#

# The address on the local server to listen to.
#KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
KUBE_API_ADDRESS="--address=0.0.0.0"

# The port on the local server to listen on.
KUBE_API_PORT="--port=8080"

# Port minions listen on
KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://172.18.8.200:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
#KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"

# Add your own!
KUBE_API_ARGS=""
  • 配置/etc/kubernetes/controller-manager/etc/kubernetes/scheduler暫時不做修改,啟動服務。
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler

3、配置node節點

  • 所有node節點編輯配置檔案/etc/kubernetes/config,修改為如下內容:
[[email protected] ~]# cat /etc/kubernetes/config
###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
#   kube-apiserver.service
#   kube-controller-manager.service
#   kube-scheduler.service
#   kubelet.service
#   kube-proxy.service
# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.18.8.200:8080"
  • 編輯檔案/etc/kubernetes/kubelet,修改內容如下:
[[email protected] ~]# cat /etc/kubernetes/kubelet
###
# kubernetes kubelet (minion) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=127.0.0.1"

# The port for the info server to serve on
KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=172.18.8.201"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://172.18.8.200:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""
  • 啟動服務。
systemctl start kubelet
systemctl start kube-proxy
systemctl enable kubelet
systemctl enable kube-proxy

4、配置flannel

編輯所有node節點/etc/sysconfig/flanneld,修改內容如下:

[[email protected] ~]# cat /etc/sysconfig/flanneld
# Flanneld configuration options  

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://172.18.8.200:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

在master節點上為 falnnel 建立分配的網路。

[[email protected] ~]#  etcdctl mk /atomic.io/network/config '{"Network": "10.244.0.0/16"}'

在各node節點上啟動 flannel。

systemctl start flanneld
systemctl enable flanneld

六、檢查驗收

1、建立Pod檢查

在master檢視各node節點情況。

[[email protected] ~]# kubectl get nodes
NAME           STATUS    AGE
172.18.8.201   Ready     59m
172.18.8.202   Ready     14m

部署nginx測試,因為拉取映象速度可能慢,可以先在各node節點拉取好。
建立檔案nginx-pod.ymal

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

建立容器。

kubectl create -f nginx-pod.ymal

發現容器一直在建立。

[[email protected] ~]# kubectl get pods -o wide
NAME        READY     STATUS              RESTARTS   AGE       IP        NODE
nginx-pod   0/1       ContainerCreating   0          12m       <none>    172.18.8.201

這種情況,我們可以使用kubectl describe pod檢視Pod因為什麼原因一直卡主。

CentOS 7.5 使用 yum 源安裝 Kubernetes 叢集(二)

2、問題解決方法

看到問題之後我們就好去進行解決,我們在node節點上執行下面命令獲取。

[[email protected] ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ... 
open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory

發現還是有問題,通過提示的路徑查詢該檔案,是個軟連線,連結目標是/etc/rhsm,並且是空的。
這裡我們不能使用yum來安裝rhsm,因為我們需要的軟體會被覆蓋掉,我們需要手動操作。

# 手動新增證書
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm 
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
# 重新手動拉取
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

現在檢視pod的狀態就已經正常了。

[[email protected] ~]# kubectl get pods -o wide
NAME        READY     STATUS    RESTARTS   AGE       IP            NODE
nginx-pod   1/1       Running   0          40m       10.244.98.2   172.18.8.201

3、建立replicationController (RC)

建立檔案nginx-rc.ymal,修改內容如下:

apiVersion: v1
kind: ReplicationController
metadata:
 name: nginx-rc
spec:
 replicas: 3
 selector:
  name: nginx-pod
 template:
  metadata:
   labels:
    name: nginx-pod
  spec:
   containers:
   - name: nginx-pod
     image: nginx
     ports:
     - containerPort: 80

建立副本控制器

[[email protected] ~]# kubectl create -f nginx-rc.ymal 
replicationcontroller "nginx-rc" created
[[email protected] ~]# kubectl get pods -o wide
NAME             READY     STATUS    RESTARTS   AGE       IP            NODE
nginx-rc-3gtpg   1/1       Running   0          4m        10.244.98.4   172.18.8.201
nginx-rc-9rc3m   1/1       Running   1          4m        10.244.64.3   172.18.8.202
nginx-rc-g3bh0   1/1       Running   1          4m        10.244.64.2   172.18.8.202
nginx-rc-vqw38   1/1       Running   0          4m        10.244.98.2   172.18.8.201
nginx-rc-w3xh8   1/1       Running   0          4m        10.244.98.3   172.18.8.201

如果遇到MissingClusterDNS的問題,可以重啟node節點。

4、建立Service

建立檔案nginx-svc.ymal,修改為如下內容:

apiVersion: v1
kind: Service
metadata:
 name: nginx-svc
spec:
 type: NodePort
 ports:
 - port: 80
   nodePort: 30001
 selector:
  name: nginx-pod

建立service。

[[email protected] ~]# kubectl create -f nginx-svc.ymal 
service "nginx-svc" created
[[email protected] ~]# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   10.254.0.1       <none>        443/TCP        3h
nginx-svc    10.254.135.249   <nodes>       80:30001/TCP   15s

目前自帶的 yum 源的軟體版本都比較低,也可以更改倉庫,使用稍微較高的一個版本。
http://cbs.centos.org/repos/virt7-kubernetes-110-release/x86_64/os/Packages/