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,壞處是配置比較複雜,很多軟體包因為一些原因,我們在大陸是訪問不到的。
請檢視博文:http://blog.51cto.com/wzlinux/2322345

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離可以在生產環境中使用的距離越來越近了,這也是我們以後注意使用的安裝方式,但是為了瞭解其中的安裝過程,我們先從其他兩種安裝方式入手。
請檢視博文:http://blog.51cto.com/wzlinux/2322616

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

二、主要元件說明

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

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

2、Node 元件

  • kubelet
    kubelet是主要的節點代理,它會監視已分配給節點的pod,具體功能:
  1. 安裝Pod所需的volume。
  2. 下載Pod的Secrets。
  3. Pod中執行的 docker(或experimentally,rkt)容器。
  4. 定期執行容器健康檢查。
  5. Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.
  6. 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 kube-apiserver,kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,etcd
172.18.8.201 node01:kubernetes-node docker,kubelet,kube-proxy,flannel
172.18.8.202 node02:kubernetes-node docker,kubelet,kube-proxy,flannel

節點及網路規劃圖如下:

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
Docker docker-1.13.1-75
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

關閉防火牆。

systemctl stop firewalld.service
systemctl disable firewalld.service

關閉SELinux。

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
setenforce 0

關閉swap。

swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

四、安裝 master 節點

1、軟體安裝

安裝需要的軟體。

yum install kubernetes-master etcd -y

修改共用的配置檔案/etc/kubernetes/config,修改master節點,因為我們都在一臺機器上面,不修改也可以。

###
# 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"

2、配置 etcd

因為我們很多服務使用到etcd,所以我們首先配置etcd服務。
在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

檢視啟動狀態。

[[email protected] ~]# netstat -tlnp|grep etcd
tcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      1506/etcd           
tcp6       0      0 :::2379                 :::*                    LISTEN      1506/etcd       

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

3、配置 apiserver 服務

編輯檔案/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

檢視各服務的啟動狀態。

[[email protected] ~]# netstat -tlnp|grep kube-apiserver
tcp6       0      0 :::6443                 :::*                    LISTEN      1622/kube-apiserver 
tcp6       0      0 :::8080                 :::*                    LISTEN      1622/kube-apiserver 

[[email protected] ~]# netstat -tlnp|grep kube-scheduler
tcp6       0      0 :::10251                :::*                    LISTEN      1646/kube-scheduler 

五、配置node節點

1、安裝需要的軟體

yum install kubernetes-node flannel docker -y

給docker配置國內加速器。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://hdi5v8p1.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload

所有node節點編輯配置檔案/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"

2、配置 kubelet 服務

編輯檔案/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=0.0.0.0"

# 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

3、配置 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

4、啟動 docker 服務

因為要讓pod使用flannel建立的網路,所以docker的啟動要在flannel後面。

systemctl restart docker
systemctl enable docker

六、檢查驗收

在master檢視各node節點情況。

[[email protected] ~]# kubectl get nodes
NAME                 STATUS    AGE
node01.wzlinux.com   Ready     12m
node02.wzlinux.com   Ready     10m

建立pod。

kubectl run nginx --image=nginx --replicas=3

發現容器一直在建立。

[[email protected] ~]# kubectl get pods -o wide
NAME                    READY     STATUS              RESTARTS   AGE       IP        NODE
nginx-701339712-099j9   0/1       ContainerCreating   0          3m        <none>    node01.wzlinux.com
nginx-701339712-vw0zh   0/1       ContainerCreating   0          3m        <none>    node02.wzlinux.com
nginx-701339712-wqjq1   0/1       ContainerCreating   0          3m        <none>    node02.wzlinux.com

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

因為網路的原因,這個地方我們訪問不到,不過我們可以間接的獲取這個映象,那我們通過阿里雲上面的映象來替代,在所以node節點執行下面的命令。

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.0 gcr.io/google_containers/pause-amd64:3.0
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.0

稍等片刻,我們在檢視pod狀態,發現已經OK,如果還有問題,可以繼續進入容器檢視日誌。

[[email protected] ~]# kubectl get pods -o wide
NAME                    READY     STATUS    RESTARTS   AGE       IP            NODE
nginx-701339712-099j9   1/1       Running   0          11m       10.244.32.2   node01.wzlinux.com
nginx-701339712-vw0zh   1/1       Running   0          11m       10.244.53.3   node02.wzlinux.com
nginx-701339712-wqjq1   1/1       Running   0          11m       10.244.53.2   node02.wzlinux.com

但是還有問題,這是因為iptables的FORWARD是預設禁止的,禁用了iptables filter表中FOWARD鏈,這樣會引起Kubernetes叢集中跨Node的Pod無法通訊。

我們這裡手動在所有node節點上面放行。

iptables -P FORWARD ACCEPT

附錄:版本更加新的yum倉庫

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

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://cbs.centos.org/repos/virt7-kubernetes-110-release/x86_64/os/
enabled=1
gpgcheck=0
EOF

其他的配置操作照舊,如果感覺下載速度慢,可以提前把rpm包下載下來,安裝配置好檢視版本。

[[email protected] ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"archive", BuildDate:"2018-06-05T13:37:07Z", GoVersion:"go1.9.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"archive", BuildDate:"2018-06-05T13:37:07Z", GoVersion:"go1.9.4", Compiler:"gc", Platform:"linux/amd64"}

注意:新的版本部分配置檔案有些不一樣,配置的時候請注意。

到此,使用yum倉庫安裝的版本已經完成。