第一章 Kubernetes基礎筆記

一、Kubernetes概述

1、背景

kubernetes(簡稱k8s)是google基於Blog進行改進後,開源出來的一款“容器管理應用”。由於近幾年來容器技術的火爆,許許多多的服務都不會直接部署在linux主機或各大雲廠商的虛擬機上;利用Docker,將每個服務做成一個image,把他們跑在各自的Container中。

這樣做的好處有非常多,比如環境配置隔離、服務啓動快、移植便捷等等。但是使用的Container多到一定程度,就會帶來容器管理上的問題:使用docker ps命令之後有一大堆Container,如果標識的不清楚也很容易混淆;某些分佈式服務,需要將Docker部署到許多不同的機器上,這也會增加我們運維的難度。因此,我們現在需要一款“專門管理容器”的平臺,爲我們提供可視化界面,方便我們對各個容器進行管理。

k8s就是這樣一款輔助我們管理容器的平臺,支持管理在分佈式環境(即多臺服務器上)啓動的 Container。

 

2、基礎概念

2.1、Master

Cluster的大腦,主要職責是調度,可以運行多個master來保證高可用。

2.2、Node

職責是運行容器應用,Node由Master管理,負責監控並彙報容器的狀態,同時根據Master的要求管理容器的生命週期。 ·

2.3、Pod

1)PodK8s的最小工作單元,每個Pod包含一個或多個容器。 

  • ·有些容器天生就是需要緊密聯繫,一起工作。Pod提供了比容器更高層次的抽象,K8s以Pod爲最小單位進行調度、擴展、共享資源、管理生命週期。
  • ·Pod中的所有容器使用同一個網絡的namespace,即相同的IP地址和Port空間。它們可以直接用localhost通信。同樣的,這些容器可以共享存儲,當K8s掛載Volume到Pod上,本質上是將volume掛載到Pod中的每一個容器。

2)Pod 控制器

K8s通常不直接創建Pod,而是通過Controller來管理Pod。Controller中定義了pod的部署屬性,比如幾個副本、在什麼樣的Node上運行等。

K8s提供了多種Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等。

  • ·ReplicationController:副本控制器,確保Pod的數量始終保持設定的個數。也支持Pod的滾動更新。
  • ·ReplicaSet:副本集,它不直接使用,有一個聲明式更新的控制器叫Deployment來負責管理。但是Deployment只能負責管理那些無狀態的應用。
  • ·StatefulSet:有狀態副本集,負責管理有狀態的應用。
  • ·DaemonSet,如果需要在每一個Node上只運行一個副本,而不是隨意運行,就需要DaemonSet。
  • ·Job:運行作業,對於時間不固定的操作,比如某個應用生成了一大堆數據集,現在需要臨時啓動一個Pod去清理這些數據集,清理完成後, 這個Pod就可以結束了。 這些不需要一直處於運行狀態的應用,就用Job這個類型的控制器去控制。如果Pod運行過程中意外中止了,Job負責重啓Pod。如果Pod任務執行完了,就不需要再啓動了。
  • ·Cronjob:週期性作業。

2.4、Service

Deployement可以部署多個副本,每個Pod都有自己的副IP,外界如何訪問這些副本。Pod會被頻繁的銷燬和重啓,IP實時變化,不能用IP, 答案是通過service。K8s service定義了外界訪問一組特定Pod的方式。service有自己的IP和端口,service爲Pod提供了負載均衡。

2.5、Namespace:

Namespace將物理的Cluster邏輯上劃分成多個虛擬Cluster,每個Cluster就是一個Namespace。不同的Namespace裏的資源是完全隔離的。

  • ·default:默認的namespace
  • ·kube-system: K8s自己創建的的系統資源放到這個namespace

2.6、Cluster

Cluster 是計算、存儲和網絡資源的集合,Kubernetes利用這些資源運行各種基於容器的應用。

2.7、Node 

工作節點,職責是運行容器應用。Node由Master管理,Node負責監控並彙報容器的狀態,並根據Master的要求管理容器的生命週期。Node運行在Linux操作系統,可以是物理機或者是虛擬機。

3、K8S的架構

Kubernetes集羣包含有節點代理Kubelet和Master組件(APIs、scheduler、etc),下面是K8S的架構圖。

 

Master節點包含API Server、Scheduler調度器、ControllerManager控制器管理器這三個核心的組件。

Node節點包含的核心組件有Kubelet、Docker容器引擎、Kube-proxy

3.1、API Server(kube-apiserver)

提供了HTTP/HTTPS RESTful API,即Kubernetes API。 API server是Kubernetes Cluster的前端接口。其他客戶端工具(CLI或UI)以及K8S其它組件可以通過它管理Cluster資源。

3.2、Scheduler(kube-scheduler)

調度器,它負責決定將Pod放在哪個Node上運行。調度時候考慮Cluster拓撲,各個節點的負載,以及應用對高可用、性能、數據親和性的需求。

3.3、Controller-Manager

負責監控每一個Controller(控制器)的健康狀態,並確保控制器是健康的。而控制器是確保Pod健康的組件。

3.4、etcd

負責保存K8s Cluster的配置信息和各種資源的狀態信息。當數據發生變化時,etcd可以快速的通知K8s組件。

3.5、Pod網絡

Pod能通信,k8s cluster必須部署Pod網絡(比如flannel是其中一個方案)

3.6、Kubelet

是Node的agent,當scheduler確定在某個Node上運行Pod後,會將Pod的具體配置信息(image、volume等)發送給該節點的kubelet,kubelet根據這些信息創建和運行容器,並向Master報告運行狀態。

3.7、Kube-proxy

service在邏輯上代表了後端的多個Pod,外界通過service訪問Pod。service接收到的請求是如何轉發到Pod的呢?這就是kube-proxy要完成的工作。每個node都運行kube-proxy服務,它負責將訪問service的TCP/UDP數據流轉發到後端容器。如果有多個副本,kube-proxy實現負載均衡。 

二、Kubernetes集羣搭建

1、環境準備

本次使用docker 18.09.9和kubelet-1.16.4,要求centos7.6以上版本

[root@localhost ~]# cat /etc/centos-release

CentOS Linux release 7.6.1810 (Core)

1.1 關閉selinux

查看selinux是否關閉

[root@localhost ~]# getenforce

Disabled

先設置臨時關閉:setenforce 0

永久關閉:vi /etc/sysconfig/selinux

設置SELINUX=disabled

1.2 、關閉swap

k8s要求系統關閉,否則安裝過程會報錯,查看系統是否關閉了swap

 

臨時禁用:swapoff -a

永久禁用:sed -i.bak '/swap/s/^/#/' /etc/fstab ##註釋掉swap那一行

作用就是修改/etc/fstab配置爲如下:

vi /etc/fstab

註釋掉代碼:

#/dev/mapper/centos-swap swap    swap    defaults        0 0

1.3、配置ip_forward轉發

ip_forward配置文件當前內容爲0,表示禁止數據包轉發,將其修改爲1表示允許

命令:echo "1" > /proc/sys/net/ipv4/ip_forward

1.4、更新docker源與k8syum

爲了一次性配置好下載源,我們一次性修改好centos7軟件源,docker源,k8s源

先清除掉系統自帶配置 cd /etc/yum.repos.d/

[root@bogon ~]# cd /etc/yum.repos.d/
[root@bogon yum.repos.d]# ll
total 36
-rw-r--r--. 1 root root 1664 Nov 23  2018 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 Nov 23  2018 CentOS-CR.repo
-rw-r--r--. 1 root root  649 Nov 23  2018 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  314 Nov 23  2018 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 Nov 23  2018 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 Nov 23  2018 CentOS-Sources.repo
-rw-r--r--. 1 root root 5701 Nov 23  2018 CentOS-Vault.repo
-rw-r--r--  1 root root 2640 Dec  4 15:58 docker-ce.repo
[root@bogon yum.repos.d]# rm -rf *
[root@bogon yum.repos.d]# ll
total 0

1)下載centos7的源和docker源:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

結果如下:

[root@bogon yum.repos.d]# ll
total 12
-rw-r--r-- 1 root root 2523 Jun 16  2018 CentOS-Base.repo
-rw-r--r-- 1 root root 2640 Mar 16 18:38 docker-ce.repo
-rw-r--r-- 1 root root  664 May 11  2018 epel-7.repo

2)配置k8s

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=0
EOF

 

3)刷新yum緩存

命令:yum clean all && yum makecache fast

 

1.5、安裝docker

docker使用版本18.09.9

命令:yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y

 

k8s運行要求docker的--cgroup-driver=systemd

cat /etc/docker/daemon.json
[root@bogon yum.repos.d]# cat /etc/docker/daemon.json
{
        "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"],
        "insecure-registries":["192.168.30.161:5000"]
}

啓動docker並設置開機啓動: 

命令:systemctl enable docker && systemctl start docker

1.6、安裝k8s組件

命令:yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4

 

設置開機啓動:

systemctl enable kubelet && systemctl start kubelet

添加kubectl上下文到環境中:

echo "source <(kubectl completion bash)" >> ~/.bash_profile

source .bash_profile

在家目錄中,配置生效:

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

[root@bogon ~]# source .bash_profile

1.7、內核參數修改

k8s網絡一般使用flannel,該網絡需要設置內核參數bridge-nf-call-iptables=1

添加參數配置文件:vi /etc/sysctl.d/k8s.conf

[root@bogon ~]# cat /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-iptables=1

net.bridge.bridge-nf-call-ip6tables=1

執行命令:

sysctl -p /etc/sysctl.d/k8s.conf

至此,環境準備工作完畢。

1.8、內核參數修改失敗常見問題

有些系統執行sysctl -p /etc/sysctl.d/k8s.conf會報異常,一般是因爲修改這個參數需要系統有br_netfilter 模塊,使用lsmod |grep br_netfilter命令,查看系統裏是否有br_netfilter模塊。

沒有則新增br_netfilter模塊:modprobe br_netfilter

上述方式重啓後無效。需要配置系統啓動加載腳本使其永久生效:

1)先加開機啓動動作:

vi /etc/rc.sysinit

# !/bin/bash

for file in /etc/sysconfig/modules/*.modules;

do[-x $file] && $file

done

2)再做加載模塊動作:

[root@bogon ~]# vi /etc/sysconfig/modules/br_netfilter.modules

添加內容:modprobe br_netfilter

3)再增加執行權限:

[root@bogon ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

2、Master節點配置

2.1Master節點初始化

命令:kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.16.4 --pod-network-cidr=10.244.0.0/16

這一步,如果出現下面錯誤,則是前面的1.6節點內核沒有配置,正常情況如下:

 

出現這一步,恭喜你,已經成功一大半了!,複製加入節點的命令。

這裏本地安裝的信息如下:

命令:kubeadm join 192.168.30.161:6443 --token k1pe7l.tqze8jxrltk9elds --discovery-token-ca-cert-hash sha256:865e1169ec58773850b496678c1b3ab252683b014ef899e68ccf4ac826528412

接下來,我們按它的提示執行操作:

mkdir -p $HOME/.kube

執行提示操作:

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g)  $HOME/.kube/config

 

備註:

kubernetes 坑人的錯誤!!!Unable to connect to the server: x509: certificate signed by unknown authority

問題復現

昨天按照教程搭建了一個集羣,今天想重新實驗下,於是執行kubeadm reset命令清除集羣所有的配置。

接着按照部署的常規流程執行:kubeadm init --kubernetes-version=v1.14.3 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=0.0.0.0命令創建集羣。然後執行以下幾個命令:

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

接着當我執行kubectl get nodes等命令時,所有的命令都會打印出錯誤:Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of “crypto/rsa: verification error” while trying to verify candidate authority certificate “kubernetes”)

當在這些 kubectl 命令後加入 --insecure-skip-tls-verify 參數時,就會報如下錯誤:error: You must be logged in to the server (Unauthorized)

問題解決:mkdir -p $HOME/.kube

這幾個命令會創建一個目錄,並複製幾個配置文件,重新創建集羣時,這個目錄還是存在的,於是我嘗試在執行這幾個命令前先執行rm -rf $HOME/.kube命令刪除這個目錄,最後終於解決了這個問題!!!

2.2、添加flannel的網絡

按照master的提示,我們接下來應該配置一個pod network。但是這裏有個大坑,因爲國內網絡不通的原因,導致該配置文件無法下載,所以此操作無法完成。你只能選擇私人定製的下面這個文件來完成。上傳文件到你的系統後,使用下面命令:

執行命令:kubectl apply -f hankin-flannel.yml

[root@localhost ~]# kubectl apply -f hankin-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created
[root@localhost ~]#

至此,大功告成

2.3、查看集羣

查看k8s集羣:kubectl get nodes

 

3、work節點初始化

work節點的配置,相對master來說簡單許多,只需要規劃好節點的名稱即可。

注意master節點初始化完成之後會有其他節點加入集羣的提示命令。

3.1、設置機器名

設置一個機器名爲work1(192.168.30.162)

[root@bogon ~]# hostnamectl set-hostname work1

配置對應的ip:vi /etc/hosts

添加配置:192.168.30.162 work1

 

3.2、加入集羣

在要加入的工作節點機器上,執行master初始化時提示的join語句,即加到master的管轄內。

這裏將192.168.30.162(work1)、192.168.30.163(work2)兩臺機器作爲work加入集羣。

執行master節點初始化完成後生成的加入集羣命令:

kubeadm join 192.168.30.161:6443 --token k1pe7l.tqze8jxrltk9elds --discovery-token-ca-cert-hash sha256:865e1169ec58773850b496678c1b3ab252683b014ef899e68ccf4ac826528412

回到master節點再次查看集羣:kubectl get nodes

 

同樣的操作將節點work2(192.168.30.163)加入到集羣:kubectl get nodes

 

4、備註:

4.1、加入master節點命令失效問題

master中的節點認證信息24小時會失效,可以重新生成(master端操作)

重新生成用於節點加入集羣的認證命令

1)創建token

[root@master ~]# kubeadm token create

pno0i6.hmhqm0qrf8n4hf4e

2)創建新的sha

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der sha256 -hex | sed 's/^.* //'

 

3)加入集羣(node操作)

kubeadm join 172.16.20.102:6443 --token [token] --discovery-token-ca-cert-hash sha256:[sha值]

4.2、初始化Kubernetes端口占用問題

解決方案:發現殺死進程都沒有用,最終重啓一下kubeadm就可以了,如下:

kubeadm reset

脫離集羣命令也是這個

4.3、重啓kubelet

systemctl daemon-reload

systemctl restart kubelet

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