k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

環境說明:

主機名 操作系統版本 ip docker version kubelet version kubeadm version kubectl version flannel version 備註
master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 V1.14.2 V1.14.2 V0.11.0 master主機
node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 V1.14.2 V1.14.2 V0.11.0 node節點
node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.6 V1.14.2 V1.14.2 V1.14.2 V0.11.0 node節點

 
 
Centos7.6安裝詳見:Centos7.6操作系統安裝及優化全紀錄
   

Kubernetes這個名字源自希臘語,意思是“舵手”,也是“管理者”,“治理者”等詞的源頭。k8s是Kubernetes的簡稱(用數字『8』替代中間的8個字母『ubernete』)
    

前言:本文通過kudeadm方式在centos7.6上安裝kubernetes v1.14.2集羣(目前centos和kubernetes都爲最新版),共分爲五個部分:
一、Docker安裝;
二、k8s安裝準備工作;
三、Master節點安裝;
四、Node節點安裝;
五、集羣測試。

一、Docker安裝

所有節點都需要安裝docker

1. 安裝依賴包

[root@centos7 ~]# yum install -y yum-utils   device-mapper-persistent-data   lvm2

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

2. 設置Docker源

[root@centos7 ~]# yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

3. 安裝Docker CE

3.1 docker安裝版本查看

[root@centos7 ~]# yum list docker-ce --showduplicates | sort -r

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

3.2 安裝docker

[root@centos7 ~]# yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣
指定安裝的docker版本爲18.09.6,由於該版本目前爲最新版,故可以直接安裝,不用指定版本:

yum install -y docker-ce docker-ce-cli containerd.io

4. 啓動Docker

[root@centos7 ~]# systemctl start docker
[root@centos7 ~]# systemctl enable docker

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

5. 命令補全

5.1 安裝bash-completion

[root@centos7 ~]# yum -y install bash-completion

5.2 加載bash-completion

[root@centos7 /]# source /etc/profile.d/bash_completion.sh

6. 鏡像加速

由於Docker Hub的服務器在國外,下載鏡像會比較慢,可以配置鏡像加速器。主要的加速器有:Docker官方提供的中國registry mirror、阿里雲加速器、DaoCloud 加速器,本文以阿里加速器配置爲例。

6.1 登陸阿里雲容器模塊

登陸地址爲:https://cr.console.aliyun.com ,未註冊的可以先註冊阿里雲賬戶

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

6.2 配置鏡像加速器

配置daemon.json文件

[root@centos7 ~]# mkdir -p /etc/docker
[root@centos7 ~]# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"]
}
EOF

重啓服務

[root@centos7 ~]# systemctl daemon-reload
[root@centos7 ~]# systemctl restart docker

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣
加速器配置完成

7. 驗證

[root@centos7 ~]# docker --version
[root@centos7 ~]# docker run hello-world

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣
通過查詢docker版本和運行容器hello-world來驗證docker是否安裝成功。

二、k8s安裝準備工作

安裝Centos是已經禁用了防火牆和selinux並設置了阿里源。master和node節點都執行本部分操作。

1. 配置主機名

1.1 修改主機名

[root@centos7 ~]# hostnamectl set-hostname master
[root@centos7 ~]# more /etc/hostname             
master

退出重新登陸即可顯示新設置的主機名master

1.2 修改hosts文件

[root@master ~]# cat >> /etc/hosts << EOF
172.27.9.131    master
172.27.9.135    node01
172.27.9.136    node02
EOF

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

2. 驗證mac地址uuid

[root@master ~]# cat /sys/class/net/ens33/address
[root@master ~]# cat /sys/class/dmi/id/product_uuid

保證各節點mac和uuid唯一

3. 禁用swap

3.1 臨時禁用

[root@master ~]# swapoff -a

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

3.2 永久禁用

若需要重啓後也生效,在禁用swap後還需修改配置文件/etc/fstab,註釋swap

[root@master ~]# sed -i.bak '/swap/s/^/#/' /etc/fstab

4. 內核參數修改

4.1 臨時修改

[root@master ~]# sysctl net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
[root@master ~]# sysctl net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-ip6tables = 1

4.2 永久修改

[root@master ~]# cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

5. 修改Cgroup Driver

5.1 修改daemon.json

修改daemon.json,新增‘"exec-opts": ["native.cgroupdriver=systemd"’

[root@master ~]# more /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}

5.2 重新加載docker

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker

修改cgroupdriver是爲了消除告警:
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

6. 設置kubernetes源

6.1 新增kubernetes源

[root@master ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • [] 中括號中的是repository id,唯一,用來標識不同倉庫
  • name 倉庫名稱,自定義
  • baseurl 倉庫地址
  • enable 是否啓用該倉庫,默認爲1表示啓用
  • gpgcheck 是否驗證從該倉庫獲得程序包的合法性,1爲驗證
  • repo_gpgcheck 是否驗證元數據的合法性 元數據就是程序包列表,1爲驗證
  • gpgkey=URL 數字簽名的公鑰文件所在位置,如果gpgcheck值爲1,此處就需要指定gpgkey文件的位置,如果gpgcheck值爲0就不需要此項了

6.2 更新緩存

[root@master ~]# yum clean all
[root@master ~]# yum -y makecache

三、Master節點安裝

1. 版本查看

[root@master ~]# yum list kubelet --showduplicates | sort -r 

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣
目前最新版是1.14.2,該版本支持的docker版本爲1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。

2. 安裝kubelet、kubeadm和kubectl

2.1 安裝三個包

[root@master ~]# yum install -y kubelet-1.14.2 kubeadm-1.14.2 kubectl-1.14.2

若不指定版本直接運行‘yum install -y kubelet kubeadm kubectl’則默認安裝最新版即1.14.2,兩種方式結果一致。

2.2 安裝包說明

  • kubelet 運行在集羣所有節點上,用於啓動Pod和容器等對象的工具
  • kubeadm 用於初始化集羣,啓動集羣的命令工具
  • kubectl 用於和集羣通信的命令行,通過kubectl可以部署和管理應用,查看各種資源,創建、刪除和更新各種組件

2.3 啓動kubelet

啓動kubelet並設置開機啓動

[root@master ~]# systemctl enable kubelet && systemctl start kubelet

2.4 kubelet命令補全

[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bash_profile
[root@master ~]# source .bash_profile 

3. 下載鏡像

3.1 鏡像下載的腳本

Kubernetes幾乎所有的安裝組件和Docker鏡像都放在goolge自己的網站上,直接訪問可能會有網絡問題,這裏的解決辦法是從阿里雲鏡像倉庫下載鏡像,拉取到本地以後改回默認的鏡像tag。

[root@master ~]# more image.sh 
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.14.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done

url爲阿里雲鏡像倉庫地址,version爲安裝的kubernetes版本。

3.2 下載鏡像

運行腳本image.sh,下載指定版本的鏡像

[root@master ~]# ./image.sh
[root@master ~]# docker images

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

4. 初始化Master

4.1 初始化

[root@master ~]# kubeadm init --apiserver-advertise-address 172.27.9.131 --pod-network-cidr=10.244.0.0/16

apiserver-advertise-address指定master的interface,pod-network-cidr指定Pod網絡的範圍,這裏使用flannel網絡方案。

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣
記錄kubeadm join的輸出,後面需要這個命令將各個節點加入集羣中。

4.2 加載環境變量

 [root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@master ~]# source .bash_profile 

本文所有操作都在root用戶下執行,若爲非root用戶,則執行如下操作:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

5. 安裝pod網絡

[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

6. master節點配置

taint:污點的意思。如果一個節點被打上了污點,那麼pod是不允許運行在這個節點上面的

6.1 刪除master節點默認污點

默認情況下集羣不會在master上調度pod,如果偏想在master上調度Pod,可以執行如下操作:

查看污點:

[root@master ~]# kubectl describe node master|grep -i taints
Taints:             node-role.kubernetes.io/master:NoSchedule

刪除默認污點:

[root@master ~]# kubectl taint nodes master node-role.kubernetes.io/master-
node/master untainted

6.2 污點機制

語法:

kubectl taint node [node] key=value[effect]   
     其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
      NoSchedule: 一定不能被調度
      PreferNoSchedule: 儘量不要調度
      NoExecute: 不僅不會調度, 還會驅逐Node上已有的Pod

打污點

[root@master ~]# kubectl taint node master key1=value1:NoSchedule
node/master tainted
[root@master ~]# kubectl describe node master|grep -i taints
Taints:             key1=value1:NoSchedule

key爲key1,value爲value1(value可以爲空),effect爲NoSchedule表示一定不能被調度

刪除污點:

[root@master ~]# kubectl taint nodes master  key1-     
node/master untainted
[root@master ~]# kubectl describe node master|grep -i taints
Taints:             <none>

刪除指定key所有的effect,‘-’表示移除所有以key1爲鍵的污點

四、Node節點安裝

1. 安裝kubelet、kubeadm和kubectl

同master節點

2. 下載鏡像

同master節點

3. 加入集羣

以下操作master上執行

3.1 查看令牌

[root@master ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
j5eoyz.zu0x6su7wzh752b3   <invalid>   2019-06-04T17:40:41+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

發現之前初始化時的令牌已過期

3.2 生成新的令牌

[root@master ~]# kubeadm token create
1zl3he.fxgz2pvxa3qkwxln

3.3 生成新的加密串

[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

3.4 node節點加入集羣

在node節點上分別執行如下操作:

[root@node01 ~]# kubeadm join 172.27.9.131:6443 --token 1zl3he.fxgz2pvxa3qkwxln  --discovery-token-ca-cert-hash sha256:5f656ae26b5e7d4641a979cbfdffeb7845cc5962bbfcd1d5435f00a25c02ea50

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

五、集羣測試

1. 部署應用

1.1 命令方式

[root@master ~]# kubectl run httpd-app --image=httpd --replicas=3
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/httpd-app created

通過命令行方式部署apache服務

1.2 配置文件方式

cat >> nginx.yml << EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      restartPolicy: Always
      containers:
      - name: nginx
        image: nginx:latest
EOF
[root@master ~]# kubectl apply -f nginx.yml 
deployment.extensions/nginx created

通過配置文件方式部署nginx服務

2. 狀態查看

2.1 查看節點狀態

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   47h     v1.14.2
node01   Ready    <none>   22h     v1.14.2
node02   Ready    <none>   6h55m   v1.14.2

2.2 查看pod狀態

[root@master ~]# kubectl get pod --all-namespaces
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
default       httpd-app-6df58645c6-42zmc       1/1     Running   0          176m
default       httpd-app-6df58645c6-g6bkc       1/1     Running   0          176m
default       httpd-app-6df58645c6-kp8tl       1/1     Running   0          176m
default       nginx-9d4cf4f77-dft2f            1/1     Running   0          18m
default       nginx-9d4cf4f77-dztxq            1/1     Running   0          18m
default       nginx-9d4cf4f77-l9gdh            1/1     Running   0          18m
kube-system   coredns-fb8b8dccf-bxvrz          1/1     Running   1          47h
kube-system   coredns-fb8b8dccf-mqvd8          1/1     Running   1          47h
kube-system   etcd-master                      1/1     Running   3          47h
kube-system   kube-apiserver-master            1/1     Running   3          47h
kube-system   kube-controller-manager-master   1/1     Running   4          47h
kube-system   kube-flannel-ds-amd64-lkh5n      1/1     Running   0          6h55m
kube-system   kube-flannel-ds-amd64-pv5ll      1/1     Running   1          24h
kube-system   kube-flannel-ds-amd64-wnn5g      1/1     Running   1          22h
kube-system   kube-proxy-42vb5                 1/1     Running   3          47h
kube-system   kube-proxy-7nrfk                 1/1     Running   0          6h55m
kube-system   kube-proxy-x7dmk                 1/1     Running   1          22h
kube-system   kube-scheduler-master            1/1     Running   4          47h

2.3 查看副本數

[root@master ~]# kubectl get deployments
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
httpd-app   3/3     3            3           178m
nginx       3/3     3            3           19m
[root@master ~]# kubectl get pod -o wide
NAME                         READY   STATUS    RESTARTS   AGE    IP           NODE     NOMINATED NODE   READINESS GATES
httpd-app-6df58645c6-42zmc   1/1     Running   0          179m   10.244.0.6   master   <none>           <none>
httpd-app-6df58645c6-g6bkc   1/1     Running   0          179m   10.244.1.2   node01   <none>           <none>
httpd-app-6df58645c6-kp8tl   1/1     Running   0          179m   10.244.2.2   node02   <none>           <none>
nginx-9d4cf4f77-dft2f        1/1     Running   0          20m    10.244.0.7   master   <none>           <none>
nginx-9d4cf4f77-dztxq        1/1     Running   0          20m    10.244.2.3   node02   <none>           <none>
nginx-9d4cf4f77-l9gdh        1/1     Running   0          20m    10.244.1.3   node01   <none>           <none>
[root@master ~]# 

可以看到nginx和httpd的3個副本pod均勻分佈在3個節點上

2.4 查看deployment詳細信息

[root@master ~]# kubectl describe deployments

k8s實踐(一):Centos7.6部署k8s(v1.14.2)集羣

2.5 查看集羣基本組件狀態

[root@master ~]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   

 
至此完成Centos7.6下k8s(v1.14.2)集羣部署。
 
 

本文參考:
1.https://docs.docker.com/install/linux/docker-ce/centos
2.https://kubernetes.io/docs/setup/independent/install-kubeadm
3.https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm
4.https://github.com/coreos/flannel
5.https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.14.md#external-dependencies;

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