kubeadm部署1.18.0單master叢集
1、有了docker,為什麼還用kubernetes?
訪問工具層 |
幫助使用者更高效的完成任務,包括web控制檯、RESTfulAPI、CI/CD、監控管理、日誌管理 |
PaaS服務層 |
為開發、測試和運維人員提供統一的平臺服務 |
容器編排 |
Kubernetes |
容器引擎 |
Docker |
IaaS基礎設施層 |
提供基礎執行環境,例如虛擬機器、物理機、網路、儲存、資料庫、公有云等 |
2、kubernetes是什麼
l Kubernetes是Google在2014年開源的一個叢集管理系統,kubernetes簡稱k8s
l Kubernetes用於容器化應用程式的部署,擴充套件和管理,目標是讓部署容器化應用簡單高效。
3、Kubernetes叢集架構與元件
Kubernetes叢集架構與元件
master元件
kube-apiserver
kubernetes API叢集的同一入口,各元件協調者,以RESTful API提供介面服務,所有物件資源的增刪改查和監聽操作都交給APIserver處理再提交給Etcd儲存
kube-controller-manager
處理叢集中常規後臺任務,一個資源對應一個控制器,而ControllerManager就是負責管理這些控制器的
kube-scheduler
根據排程演算法為新建立的POdxuanz yig Node節點,可以在任意部署,可以部署在同一個節點上,也可以部署在不同節點上
etcd
分散式鍵值儲存系統,用於報銷叢集狀態資料,比如Pod、service等物件資訊,可以獨立部署,但是需要部署在3個叢集機器上,保證高可用。
Node元件
kubelet
kubelet是master在node節點上的agent,管理本機執行容器的生命週期,比如建立容器、Pod掛載資料卷、下載secret、獲取容器和節點狀態等工作,kubelet將每個Pod轉成一組容器。
kube-proxy
在Node節點上實現Pod網路代理,維護網路規則和四層負載均衡工作
docker或rocket
容器引擎,執行容器
kubeadm 將k8s大部分元件都容器化
Master節點:
- kube-apiserver
- controller-manager
- scheduler
- etcd
Node節點:
- kubelet
- kube-proxy
- Docker
kubelet、docker以systemd守護程序方式部署。
4、Kubernetes核心概念
Pod
最小部署單元
一組容器的集合
一個Pod中的容器共享網路名稱空間
Pod是短暫的
Controller 控制器
ReplicaSet:確保預期的Pod副本數量,多刪少起
Deployment:無狀態應用部署
StatefulSet:有狀態應用部署
DaemonSet:確保所有Node運行同一個Pod
Job:一次性任務
Cronjob:定時任務
更高階層次物件,部署和管理Pod
Service
防止Pod失聯
定義一組Pod的訪問策略
由kube-proxy去實現的
Label:標籤附近到某個資源上,用於關聯物件、查詢和刷選
Namespace:名稱空間,將物件邏輯上隔離資源
kubernetes叢集部署、配置
- 生產環境部署k8s的2種方式
- 伺服器硬體配置推薦
- 使用kubeadm快速部署一個k8s叢集
- Kubectl命令列管理工具
生產環境部署k8s的2種方式
l Kubeadm
Kubernetes是一個工具,提供kubeadm init和kubeadm join 用於快速部署叢集,測試環境推薦方法
地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
l 二進位制
生產環境推薦,從官方下載發現版的二進位制包,手工部署每個組建,組成kubernetes叢集
下載地址:https://github.com/kubernetes/kubernetes/releases
1. 安裝要求
在開始之前,部署Kubernetes叢集機器需要滿足以下幾個條件:
l 一臺或多臺機器,作業系統 CentOS7.x-86_x64
l 硬體配置:2GB或更多RAM,2個CPU或更多CPU,硬碟30GB或更多
l 叢集中所有機器之間網路互通
l 可以訪問外網,需要拉取映象
l 禁止swap分割槽
2、準備環境(優化系統環境)
1、時間同步
echo "#time sync by fage at 2019-7-22" >>/var/spool/cron/root echo "*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root systemctl restart crond.service
2、關閉防火牆和selinux
systemctl stop firewalld systemctl disable firewalld sed -i s#SELINUX=enforcing#SELINUX=disable#g /etc/selinux/config setenforce 0
3、更改主機名
更改master主機名
hostname k8s-master echo "k8s-master" >/etc/hostname
更改node主機名 node-1
hostname node-1 echo "node-1" >/etc/hostname
更改node主機名 node-2
hostname node-2 echo "node-2" >/etc/hostname
4、更改hosts檔案(叢集機器都操作)
cat >/etc/hosts <<EOF 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.110 k8s-master 192.168.10.111 node-1 192.168.10.112 node-2 EOF
5、分發公鑰,每臺都要執行(非必須項)
ssh-keygen -t rsa -f /root/.ssh/id_rsa -P "" ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
6、全部節點node要禁用swap裝置 不禁用要在初始化配置宣告
swapoff -a #臨時關閉 sed -i "s@/dev/mapper/centos-swap swap@#/dev/mapper/centos-swap swap@g" /etc/fstab #永久關閉
7、將橋接的IPv4流量傳遞到iptables的鏈:
cat > /etc/sysctl.d/k8s.conf << EOF net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system #執行生效
3、全部機器安裝 Docker/kubeadm/kubelet/kubectl
Kubernetes預設CRI(容器執行時)為Docker,因此先安裝Docker。
3.1 安裝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-18.06.1.ce-3.el7 #也可以安裝19.03.4版本官方推薦 systemctl enable docker && systemctl start docker docker --version #docker映象加速器 cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF systemctl restart docker.service docker info
3.2 新增阿里雲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
3.3 安裝kubeadm,kubelet和kubectl(所有機器操作)
由於版本更新頻繁,這裡指定版本號部署:
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 systemctl enable kubelet.service
4. 部署Kubernetes Master
在192.168.10.110(Master)執行。
kubeadm init \ --apiserver-advertise-address=192.168.10.110 \ --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 \ --ignore-preflight-errors=all
由於預設拉取映象地址k8s.gcr.io國內無法訪問,這裡指定阿里雲映象倉庫地址。
解釋含義: --apiserver-advertise-address=192.168.10.110 \ #呼叫API藉口的地址 --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 \ #叢集節點中pod使用的網路 --ignore-preflight-errors=all #忽略所有初始化種遇到的錯誤資訊
初始化方法二:
或者使用配置檔案引導:
cat kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.18.0 imageRepository: registry.aliyuncs.com/google_containers networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12
執行命令指定檔案即可
kubeadm init --config kubeadm.conf --ignore-preflight-errors=all
初始化完後需要建立程式配置資料夾、複製授權資訊配置檔案到目錄和授權
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
初始化過程執行的步驟說明
kubeadm init步驟:
1、[preflight] 環境檢查 2、[kubelet-start] 準備kubelet配置檔案/var/lib/kubelet/config.yaml並啟動 3、[certs] 證書目錄 /etc/kubernetes/pki 4、[kubeconfig] kubeconfig是用於連線k8s的認證檔案 5、[control-plane] 靜態pod目錄 /etc/kubernetes/manifests 6、[etcd] 靜態pod啟動etcd 7、[upload-config] kubeadm-config儲存到kube-system configmap 8、[mark-control-plane] 給master節點打汙點,不讓pod分配 9、[bootstrap-token] 引導kubelet證書 10、[addons] 部署coredns和kube-proxy
5、網路方案(CNI)
1、Calico 推薦方案,支援網路策略
為什麼部署CNI網路?
部署CNI是為了不同主機之間的Pod進行通訊,因為kubernetes資源排程是需要通訊進行計算伺服器資源情況進行分配的 Calico是一個純三層的資料中心網路方案,Calico支援廣泛的平臺,包括Kubernetes、OpenStack等。 Calico 在每一個計算節點利用 Linux Kernel 實現了一個高效的虛擬路由器( vRouter) 來負責資料轉發,而每個 vRouter 通過 BGP 協議負責把自己上執行的 workload 的路由資訊向整個 Calico 網路內傳播。 此外,Calico 專案還實現了 Kubernetes 網路策略,提供ACL功能
下載官方預設配置檔案
https://docs.projectcalico.org/manifests/calico.yaml
下載完後還需要修改裡面配置項:
- 定義Pod網路(CALICO_IPV4POOL_CIDR),與前面初始化叢集網路pod CIDR配置一樣,後面叢集所有的pod都會使用這個網路進行分配地址
- 選擇工作模式(CALICO_IPV4POOL_IPIP),支援**BGP(Never)**、**IPIP(Always)**、**CrossSubnet**(開啟BGP並支援跨子網)
IPIP 隧道模式(overlay網路),基於乙太網基礎上承載容器資料表 BGP 純路由方案,要求在二層網路中,比較推薦的模式(對效能要求高的環境) CrossSubnet 跨網段走IPIP,同網段走BGP
修改完後應用清單和檢視狀態:
kubectl apply -f calico.yaml kubectl get pods -n kube-system
2 Flannel 以前老版本推薦使用
Flannel是CoreOS維護的一個網路元件,Flannel為每個Pod提供全域性唯一的IP,Flannel使用ETCD來儲存Pod子網與Node IP之間的關係。
flanneld守護程序在每臺主機上執行,並負責維護ETCD資訊和路由資料包。
yaml下載地址:
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
國外下載地址比較慢,可以考慮更換為國內的映象下載地址
部署完成網路後建立pod測試是否能夠正常訪問
kubectl create deployment nginx --image=nginx #建立pod kubectl expose deployment nginx --port=80 --type=NodePort #將pod的叢集埠暴露外部訪問
訪問地址:http://NodeIP:Port
部署管理叢集URL頁面
yaml下載地址,2.0版
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
預設Dashboard只能叢集內部訪問,修改Service為NodePort型別,暴露到外部:
vim recommended.yaml
32 kind: Service 33 apiVersion: v1 34 metadata: 35 labels: 36 k8s-app: kubernetes-dashboard 37 name: kubernetes-dashboard 38 namespace: kubernetes-dashboard 39 spec: 40 type: NodePort 41 ports: 42 - port: 443 43 targetPort: 8443 44 nodePort: 30001 45 selector: 46 k8s-app: kubernetes-dashboard
生效檔案
kubectl apply -f recommended.yaml kubectl get svc -n kubernetes-dashboard
訪問地址:https://NodeIP:30001
建立service account並繫結預設cluster-admin管理員叢集角色:
kubectl create serviceaccount dashboard-admin -n kube-system #建立使用者 kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin #授權 kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}') #獲取token
到此部署完成