Kubernetes是Google開源的容器叢集管理系統,整個生態系統使用Go語言編寫,是基於Docker構建一個容器的排程服務,提供資源排程、均衡容災、服務註冊、動態擴縮容等功能套件。Kubernetes更加輕鬆地自動伸縮應用,減少宕機時間,提高安全性。無需額外編寫指令碼,就能檢查、重新啓動及改變Docker容器的數量,可以基於資源使用情況自動擴充套件容器。K8s的使用場景是需要快速伸縮的大型應用程式,K8s可以充分利用計算和儲存資源。
可移植:支援公有雲,私有雲,混合雲。
自動化:自動部署,自動重新啓動,自動複製,自動伸縮擴充套件。
可延伸:模組化,外掛化,可掛載,可組合。
數據卷: Pod中容器之間共用數據,可以使用數據卷。
應用程式健康檢查: 容器內服務可能進程堵塞無法處理請求,可以設定監控檢查策略保證應用健壯性。
複製應用程式範例: 控制器維護着Pod副本數量,保證一個Pod或一組同類的Pod數量始終可用。
彈性伸縮: 根據設定的指標(CPU利用率)自動縮放Pod副本數。
服務發現: 使用環境變數或DNS服務外掛保證容器中程式發現Pod入口存取地址。
負載均衡: 一組Pod副本分配一個私有的叢集IP地址,負載均衡轉發請求到後端容器。在叢集內部其他Pod可通過這個ClusterIP存取應用。
卷動更新: 更新服務不中斷,一次更新一個Pod,而不是同時刪除整個服務。
服務編排: 通過檔案描述部署服務,使得應用程式部署變得更高效。
資源監控: Node節點元件整合cAdvisor資源收集工具,可通過Heapster彙總整個叢集節點資源數據,然後儲存到InfluxDB時序數據庫,再由Grafana展示。
提供認證和授權: 支援屬性存取控制(ABAC)、角色存取控制(RBAC)認證授權策略。
master元件包括: kube-apiserver, kube-controller-manager, kube-scheduler;
Node元件包括: kubelet, kube-proxy, docker或rocket(rkt);
docker或rocket(rkt): 容器。
etcd: 負責節點間的服務發現和設定共用,保持叢集狀態,比如Pod、Service等物件資訊。
kube-apiserver: 提供認證、授權、存取控制、API註冊和發現等HTTPAPI介面服務。
kubectl: 命令列工具,發送給kube-apiserver,作爲整個系統的操作入口。
kubelet: 管理pods和它們上面的容器,images映象、Volume(CVI)和網路(CNI)管理。
kube-controller-manager: 維護叢集的狀態,比如故障檢測、自動擴充套件、卷動更新等。
kube-scheduler: 資源排程,按照預定的排程策略將Pod排程到相應的機器上。
container runtime: 映象管理以及Pod和容器的執行。
kube-proxy: 爲Service提供cluster內部的服務發現和負載均衡。
kube-dns: 負責爲整個叢集提供DNS服務;
Ingress Controller: 爲服務提供外網入口;
Heapster: 提供資源監控;
Dashboard: 提供GUI;
Federation: 提供跨可用區的叢集;
Fluentd-elasticsearch: 提供叢集日誌採集、儲存與查詢;
cluster 是計算、儲存和網路資源的集合,k8s利用這些資源執行各種基於容器的應用。
master 是cluster的大腦,他的主要職責是排程,即決定將應用放在那裏執行。爲了實現高可用,可以執行多個master。
node 職責是執行容器應用。node由master管理,node負責監控並彙報容器的狀態,同時根據master的要求管理容器的生命週期。
pod k8s的最小工作單元。每個pod包含一個或者多個容器。pod中的容器會作爲一個整體被master排程到一個node上執行。
controller
k8s通常不會直接建立pod,而是通過controller來管理pod的。controller中定義了pod的部署特性,比如有幾個劇本,在什麼樣的node上執行等。爲了滿足不同的業務場景,k8s提供了多種controller,包括deployment、replicaset、daemonset、statefulset、job等。
deployment 是最常用的controller。deployment可以管理pod的多個副本,並確保pod按照期望的狀態執行。
replicaset 實現了pod的多副本管理。使用deployment時會自動建立replicaset。
daemonset 用於每個node最多隻執行一個pod副本的場景。
statefuleset
能夠保證pod的每個副本在整個生命週期中名稱是不變的,而其他controller不提供這個功能。同時statefulset會保證副本按照固定的順序啓動、更新或者刪除。
job 用於執行結束就刪除的應用,而其他controller中的pod通常是長期持續執行的。
service 定義了外界存取一組特定pod的方式。service有自己的IP和埠,service爲pod提供了負載均衡。
namespace 將一個物理的cluster邏輯上劃分成多個虛擬cluster,不同的namespace裡的資源是完全隔離的。
kubeadm是官方社羣推出的一個用於快速部署kubernetes叢集的工具。
3台物理機或虛擬機器(記憶體>=2GB,CPU>=2)
操作系統CentOS7.x-86_x64(禁止swap分割區)
可以存取外網,需要拉取映象;
k8s-master 192.168.31.61
k8s-node1 192.168.31.62
k8s-node2 192.168.31.63
關閉防火牆:
systemctl stop firewalld
systemctl disable firewalld
關閉selinux:
sed -i 's/enforcing/disabled/'/etc/selinux/config # 永久
setenforce 0# 臨時
關閉swap:
swapoff -a # 臨時
vim /etc/fstab # 永久
分別設定主機名:
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
將橋接的IPv4流量傳遞到iptables的鏈:
cat >/etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables =1
net.bridge.bridge-nf-call-iptables =1
EOF
sysctl --system # 生效
時間同步:
yum install ntpdate -y
ntpdate time.windows.com
安裝Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
設定映象下載加速器:
cat >/etc/docker/daemon.json << EOF
{
"registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
新增阿裡雲YUM軟體源
cat >/etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安裝kubeadm,kubelet和kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet
kubeadm init \
--apiserver-advertise-address=192.168.31.61 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
拷貝kubectl使用的連線k8s認證檔案到預設路徑:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
在192.168.31.62/63(Node)執行。
向叢集新增新節點,執行在kubeadm init輸出的kubeadm join命令:
kubeadm join 192.168.31.61:6443--token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
預設token有效期爲24小時,重新建立token:
kubeadm token create --print-join-command
使用Flannel解決容器跨主機網路通訊。
Flannel使用ETCD來儲存Pod子網與Node IP之間的關係。
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改國內映象地址
sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.11.0-amd64#g" kube-flannel.yml
kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-system
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
建立使用者
kubectl create serviceaccount dashboard-admin -n kube-system
使用者授權
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
獲取使用者Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
https://blog.oxings.com/article/24.html