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

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

host ats water count bytes 通信 lis cdc 功能

一、安裝方式介紹

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最小化安裝

節點及網絡規劃圖如下:

技術分享圖片

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:
[root@master ~]# 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參數:
[root@master ~]# 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,修改為如下內容:
[root@node01 ~]# 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,修改內容如下:
[root@node01 ~]# 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,修改內容如下:

[root@node01 ~]# 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 創建分配的網絡。

[root@master ~]#  etcdctl mk /atomic.io/network/config ‘{"Network": "10.244.0.0/16"}‘

在各node節點上啟動 flannel。

systemctl start flanneld
systemctl enable flanneld

六、檢查驗收

1、創建Pod檢查

在master查看各node節點情況。

[root@master ~]# 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

發現容器一直在創建。

[root@master ~]# 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因為什麽原因一直卡主。

技術分享圖片

2、問題解決方法

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

[root@node01 ~]# 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的狀態就已經正常了。

[root@master ~]# 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

創建副本控制器

[root@master ~]# kubectl create -f nginx-rc.ymal 
replicationcontroller "nginx-rc" created
[root@master ~]# 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。

[root@master ~]# kubectl create -f nginx-svc.ymal 
service "nginx-svc" created
[root@master ~]# 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/

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