Centos7下yum安裝kubernetes


一、前言   

  Kubernetes 是Google開源的容器集群管理系統,基於Docker構建一個容器的調度服務,提供資源調度、均衡容災、服務注冊、動態擴縮容等功能套件,目前centos yum源上最新版本為1.5.2。

  本文基於Centos7.5構建Kubernetes平台,在正式介紹之前,大家有必要先理解Kubernetes幾個核心概念及其承擔的功能。

  以下為Kubernetes的架構設計圖:

  

  1. Pods   

  在Kubernetes系統中,調度的最小顆粒不是單純的容器,而是抽象成一個Pod,Pod是一個可以被創建、銷毀、調度、管理的最小的部署單元。比如一個或一組容器。

  2. Replication Controllers   

  Replication Controller是Kubernetes系統中最有用的功能,實現復制多個Pod副本,往往一個應用需要多個Pod來支撐,並且可以保證其復制的副本數,即使副本所調度分配的主宿機出現異常,通過Replication Controller可以保證在其它主宿機啟用同等數量的Pod。Replication Controller可以通過repcon模板來創建多個Pod副本,同樣也可以直接復制已存在Pod,需要通過Label selector來關聯。

  3. Services 

  Services是Kubernetes最外圍的單元,通過虛擬一個訪問IP及服務端口,可以訪問我們定義好的Pod資源,目前的版本是通過iptables的nat轉發來實現,轉發的目標端口為Kube_proxy生成的隨機端口,目前只提供GOOGLE雲上的訪問調度,如GCE。 

  4. Labels 

  Labels是用於區分Pod、Service、Replication Controller的key/value鍵值對,僅使用在Pod、Service、 Replication Controller之間的關系識別,但對這些單元本身進行操作時得使用name標簽。 

  5. Proxy   

  Proxy不但解決了同一主宿機相同服務端口沖突的問題,還提供了Service轉發服務端口對外提供服務的能力,Proxy后端使用了隨機、輪循負載均衡算法。

  6. Deployment   

  Kubernetes Deployment提供了官方的用於更新Pod和Replica Set(下一代的Replication Controller)的方法Kubernetes Deployment提供了官方的用於更新Pod和Replica Set(下一代的Replication Controller)的方法,您可以在Deployment對象中只描述您所期望的理想狀態(預期的運行狀態),Deployment控制器為您將現在的實際狀態轉換成您期望的狀態,例如,您想將所有的webapp:v1.0.9升級成webapp:v1.1.0,您只需創建一個Deployment,Kubernetes會按照Deployment自動進行升級。現在,您可以通過Deployment來創建新的資源(pod,rs,rc),替換已經存在的資源等。   Deployment集成了上線部署、滾動升級、創建副本、暫停上線任務,恢復上線任務,回滾到以前某一版本(成功/穩定)的Deployment等功能,在某種程度上,Deployment可以幫我們實現無人值守的上線,大大降低我們的上線過程的復雜溝通、操作風險

二、Kubernetes集群部署

1,環境配置說明

  etcd  192.168.20.73

  master  192.168.20.73  

  node1  192.168.20.74  node2  192.168.20.75

2,事前准備

  關閉防火牆;關閉SELinux;關閉Swap交換分區;master與node之間ssh免密登錄;同步NTP時間;所有IP均能訪問外網。操作過程略。

 1 [root@master ~]# docker --version
 2 Docker version 1.13.1, build 6e3bb8e/1.13.1
 3 [root@master ~]# kubectl --version
 4 Kubernetes v1.5.2
 5 [root@master ~]# etcd --version
 6 etcd Version: 3.2.22
 7 Git SHA: 1674e68
 8 Go Version: go1.9.4
 9 Go OS/Arch: linux/amd64
10 [root@master ~]# cat /etc/redhat-release 
11 CentOS Linux release 7.5.1804 (Core) 
12 [root@master ~]# uname -a
13 Linux master 4.17.6-1.el7.elrepo.x86_64 #1 SMP Wed Jul 11 17:24:30 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux

  

3,安裝部署(在master上操作) 

 1 #每台添加hosts文件
 2 192.168.20.73 master
 3 192.168.20.73 etcd3
 4 192.168.20.74 node1
 5 192.168.20.75 node2
 6 
 7 #配置kubernetes源
 8 vim kubernetes.repo
 9 [kubernetes]
10 name=Kubernetes
11 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
12 enabled=1
13 gpgcheck=0
14 repo_gpgcheck=0
15 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
16 
17 #master上yum安裝etcd kubernetes-master
18 #安裝kubernetes時也可以不用區分master或node,直接使用 yum -y install kubernetes 會同時安裝master和node包
19 yum -y install etcd kubernetes-master

 

4,此過程會同時安裝docker、kuberlet、kuberctl等工具,非常方便。如果此前安裝過docker-ce版本,會提示報錯。卸載重裝即可。

5,修改配置文件。本機etcd已部署集群模式,所以etcd名稱為etcd3,在此可以自定義etcd1 或默認default。

 1 [root@master kubernetes]# pwd
 2 /etc/kubernetes
 3 [root@master kubernetes]# ls
 4 apiserver  config  controller-manager  kubelet  proxy  scheduler 
 5 
 6 #修改etcd配置文件
 7 [root@master ~]# grep -v '^#' /etc/etcd/etcd.conf
 8 ETCD_NAME=etcd3
 9                                                                                                                                                                    
10 ETCD_DATA_DIR="/var/lib/etcd/etcd3"
11 
12 ETCD_LISTEN_PEER_URLS="http://192.168.20.73:2380"
13 
14 ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.20.73:2379"
15 
16 ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.20.73:2380"
17 
18 ETCD_INITIAL_CLUSTER="etcd3=http://192.168.20.73:2380"
19 
20 ETCD_INITIAL_CLUSTER_STATE="new"
21 
22 ETCD_INITIAL_CLUSTER_TOKEN="etcd-test"
23 
24 ETCD_ADVERTISE_CLIENT_URLS="http://192.168.20.73:2379"
25 
26 #啟動服務
27 systemctl start etcd
28 systemcet enable etcd 
29 
30 # 檢查etcd cluster狀態
31 [root@master ~]# etcdctl cluster-health
32 member ec71f609370df393 is healthy: got healthy result from http://192.168.20.73:2379
33 cluster is healthy
34 #檢查etcd成員列表,由於是單節點部署,只有一台
35 [root@master ~]# etcdctl member list
36 ec71f609370df393: name=etcd3 peerURLs=http://192.168.20.73:2380 clientURLs=http://192.168.20.73:2379 isLeader=true

6,etcd集群模式cluster狀態為:(etcd集群模式,參加另一篇文章。)

1 [root@master ~]# etcdctl cluster-health
2 member 85b5f1a0537e385d is healthy: got healthy result from http://192.168.20.71:2379
3 member 9f304c9e0feb949d is healthy: got healthy result from http://192.168.20.72:2379
4 member ec71f609370df393 is healthy: got healthy result from http://192.168.20.73:2379
5 cluster is healthy
6 [root@master ~]# etcdctl member list
7 85b5f1a0537e385d: name=etcd1 peerURLs=http://192.168.20.71:2380 clientURLs=http://192.168.20.71:2379 isLeader=false
8 9f304c9e0feb949d: name=etcd2 peerURLs=http://192.168.20.72:2380 clientURLs=http://192.168.20.72:2379 isLeader=false
9 ec71f609370df393: name=etcd3 peerURLs=http://192.168.20.73:2380 clientURLs=http://192.168.20.73:2379 isLeader=true

7,配置master服務

 1 #1)kube-apiserver配置文件
 2 [root@master ~]# cat /etc/kubernetes/config 
 3 ###
 4 KUBE_LOGTOSTDERR="--logtostderr=true"
 5 KUBE_LOG_LEVEL="--v=0"
 6 KUBE_ALLOW_PRIV="--allow-privileged=false"
 7 KUBE_MASTER="--master=http://192.168.20.73:8080"
 8 [root@master ~]# cat /etc/kubernetes/apiserver 
 9 ###
10 ## kubernetes system config
11 KUBE_API_ADDRESS="--address=0.0.0.0"
12 KUBE_API_PORT="--port=8080"
13 KUBELET_PORT="--kubelet-port=10250"
14 KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.20.73:2379"
15 KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
16 KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key"
17 KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
18 KUBE_API_ARGS=""
19 [root@master ~]# 
20 
21 #2)controller-manager配置文件
22 [root@master ~]# cat /etc/kubernetes/controller-manager 
23 ###
24 # The following values are used to configure the kubernetes controller-manager
25 
26 # defaults from config and apiserver should be adequate
27 
28 # Add your own!
29 KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key"
30 
31 #3)scheduler配置文件
32 [root@master ~]# cat /etc/kubernetes/scheduler 
33 ###
34 # kubernetes scheduler config
35 
36 # default config should be adequate
37 
38 # Add your own!
39 KUBE_SCHEDULER_ARGS=""

## 補充說明
#此處會發現,多個serviceaccount.key的配置行,是由於k8s大部分訪問都需要證書認證,在后續創建pod時就會報錯

#查看 tail -f /var/log/message  發現報以下錯誤:

kube-controller-manager: I0919 17:57:49.292014   24551 event.go:217] Event(api.ObjectReference{Kind:"Deployment", Namespace:"default", Name:"redis-master", UID:"774ac6cd-bbf2-11e8-be6f-00505684252c", APIVersion:"extensions", ResourceVersion:"288298", FieldPath:""}): type: 'Normal' reason: 'ScalingReplicaSet' Scaled up replica set redis-master-1610630896 to 1
Sep 19 17:57:58 master3 kube-controller-manager: I0919 17:57:58.320908   24551 event.go:217] Event(api.ObjectReference{Kind:"ReplicaSet", Namespace:"default", Name:"redis-master-1610630896", UID:"774d552a-bbf2-11e8-be6f-00505684252c", APIVersion:"extensions", ResourceVersion:"288299", FieldPath:""}): type: 'Warning' reason: 'FailedCreate' Error creating: No API token found for service account "default", retry after the token is automatically created and added to the service account

 

 解決辦法:

1)首先生成密鑰:
openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048

2)編輯/etc/kubenetes/apiserver
添加以下內容:
KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key"

3)再編輯/etc/kubernetes/controller-manager
添加以下內容:
KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key"

不建議修改apiserver的配置文件:

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

刪除 ServiceAccount,即為:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

 

8,我們繼續配置node節點,最后一起啟動吧

 1 #1)在etcd服務上首先需要添加網絡,即在master上
 2 [root@master ~]# etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}'
 3 {"Network": "10.255.0.0/16"}
 4 [root@master ~]# etcdctl get /k8s/network/config
 5 {"Network": "10.255.0.0/16"}
 6 
 7 #此配置是將數據寫入到etcd數據目錄中的,不會生成實際目錄
 8 
 9 #2)配置node1節點,網絡控件采用flannel方式
10 #yum 安裝kubernetes-node 和 flannel
11 yum -y install kubernetes-node flannel
12 
13 #3)安裝成功后,修改配置文件
14 [root@node1 ~]# grep -v '^#' /etc/sysconfig/flanneld 
15 FLANNEL_ETCD_ENDPOINTS="http://192.168.20.73:2379"
16 FLANNEL_ETCD_PREFIX="/k8s/network"
17 FLANNEL_OPTIONS="--iface=ens192"
18 # 網卡信息用ip a命令獲取
19 
20 #4)配置node1 
21 [root@node1 ~]# ls /etc/kubernetes/
22 config  kubelet  proxy
23 [root@node1 ~]# cat /etc/kubernetes/config 
24 ###
25 # kubernetes system config
26 KUBE_LOGTOSTDERR="--logtostderr=true"
27 KUBE_LOG_LEVEL="--v=0"
28 KUBE_ALLOW_PRIV="--allow-privileged=false"
29 KUBE_MASTER="--master=http://192.168.20.73:8080"
30 [root@node1 ~]# cat /etc/kubernetes/kubelet 
31 ###
32 KUBELET_ADDRESS="--address=192.168.20.74"
33 KUBELET_PORT="--port=10250"
34 KUBELET_HOSTNAME="--hostname-override=192.168.20.74"
35 KUBELET_API_SERVER="--api-servers=http://192.168.20.73:8080"
36 #KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
37 KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.200.10/source/pause-amd64:3.1"
38 KUBELET_ARGS=""
39 [root@node1 ~]# cat /etc/kubernetes/proxy 
40 ###
41 # kubernetes proxy config
42 
43 # default config should be adequate
44 
45 # Add your own!
46 KUBE_PROXY_ARGS="0.0.0.0"
47 
48 ##備注 kubelet配置文件,默認image下載方式是外網下載,可以修改為自己的harbor地址

9,node2配置與node1相同,唯一需要將ip修改為node2的IP地址即可。

10,激動人心的啟動時刻:

 1 #首先啟動master,之前已啟動了etcd服務,可通過ss命令查看端口狀態
 2 #按順序啟動master上的服務
 3 systemctl start kube-apiserver kube-controller-manager kube-scheduler
 4 
 5 #按順序啟動兩台node節點
 6 systemctl start flanneld kubelet kube-proxy
 7 
 8 #在master上看到node狀態
 9 [root@master ~]# kubectl get nodes
10 NAME            STATUS    AGE
11 192.168.20.74   Ready     3d
12 192.168.20.75   Ready     3d

至此,kubernetes搭建完成。

kubernetes中文社區:https://www.kubernetes.org.cn/

kubernetes中文社區命令使用:http://docs.kubernetes.org.cn/683.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM