kuberbetes的架构与kubernetets集群搭建
目錄
一.k8s概述
1.k8s是什么
2.K8S是做什么用的?
3.為什么要使用K8S?
4.k8s架構圖解
5.角色與功能
1)Master管理節點(管理節點)
2)node計算節點
6.master節點服務
1)API Server
2)Scheduler
3)Controller manager
4)etcd的概述
5)服務端口
7.計算節點node概述
二.私有鏡像倉庫
1.基礎了解
1)安裝部署方式
2)官方工具kubeadm的方式安裝
3)部署環境要求
2.安裝倉庫
1)客戶端倉庫配置文件概述
2)安裝倉庫
3)使用腳本初始化倉庫
3.客戶端使用倉庫
三.kubernetes 安裝
1.環境準備
2.安裝master
1)安裝部署工具
2)master軟件包概述
3)安裝工具軟件包并指定私有鏡像倉庫
4)Tab鍵設置
5)下載kubernetes的鏡像
6)安裝IPVS負載均衡與概述
7)配置master主機環境
8)使用kubeadm部署
9)驗證安裝結果
3.node節點加入集群
1)node節點如何加入集群
2)token管理
3)獲取token與刪除token
4)創建token
5)獲取token_hash
6)node安裝
4.k8s網絡插件安裝配置
1)flannel概述
2)準備資源
3)修改配置文件并安裝
4)驗證結果
一.k8s概述
K8s 是容器集群管理系統,是一個開源的平臺,可以實現容器集群的自動化部署、自動擴縮容、維護等功能
1.k8s是什么
-
Kubernetes的名字來自希臘語,意思是舵手或領航員。K8s是將k和s之間的8個字母ubernete替換為8的縮寫。
-
K8S的創造者,是眾人皆知的行業巨頭一一Google。
-
K8S并不是一件全新的發明,他是Google10多年大規模容器管理技術Borg的開源版本。
-
2014年6月K8S由Goog le公司正式公布出來并宣布開源。
2.K8S是做什么用的?
-
就在Docker容器技術被炒得熱火朝天之時,大家發現,如果想要將Docker應用于具體的業務實現,是存在困難的
-
編排、管理和調度等各個方面,都不容易。于是,人們迫切需要一套管理系統,對Docker 及容器進行更高級更靈活的管理,就在這個時候,K8S出現了
-
K8s是容器集群管理系統,是一個開源的平臺,可以實現容.器集群的自動化部署、自動擴縮容、維護等功能
3.為什么要使用K8S?
-有大量跨主機的容器需要管理
-快速部署應用
-快速擴展應用
-無縫對接新的應用功能,
-節省資源,優化硬件資源的使用
4.k8s架構圖解
?核心角色
-master(管理節點)
-node(計算節點)
-image(鏡像倉庫)
5.角色與功能
1)Master管理節點(管理節點)
-Master提供集群的控制
-對集群進行全局決策
-檢測和響應集群事件
-Master主要由 apiserver, kubproxy, scheduler, controller manager 和etcd服務組成
2)node計算節點
-運行容器的實際節點
-維護運行Pod,并提供具體應用的運行環境
-node有kubelet,kube-poxy和docker組成
-計算節點被設計成水平擴展,該組件在多個節點運行
6.master節點服務
1)API Server
-
是整個系統的對外接口,供客戶端和其它組件調用
-
后端元數據存儲于etcd中(鍵值數據庫)
2)Scheduler
負責對集群內部的資源進行調度,相當于“調度室”?
3)Controller manager
負責管理控制器,相當于“大總管”
4)etcd的概述
kubernet在運行過程中產生的元數據全部存儲在etcd鍵值數據庫中
etcd的定義
etcd 是Core0S團隊于2013年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value) 數據庫,基于Go語言實現。在分布式系統中,各種服務的配置信息的管理分享,服務的發現是一個很基本同時也是很重要的問題。CoreOS項目就希望基于etcd 來解決這一問題。
kubernetes在運行過程中產生的元數據全部存儲在etcd中
etcd鍵值管理
-
在鍵的組織上etcd采用了層次化的空間結構(類似于文件 系統中目錄的概念),用戶指定的鍵可以為單獨的名字
-
如創建key鍵值, 此時實際上放在根目錄/key下面
-
也可以為指定目錄結構, 如/dir1/dir2/key, 則將創建相 應的目錄結構
-
etcd有kubernet es集群自動管理, 用戶無需手動干預
-
etcdctl是etcd的客戶端管理程序
5)服務端口
| TCP | 6443 | kube-apiserver | 所有組件端口 |
| TCP | 2379-2380 | etcd | kube-api,etcd服務 |
| TCP | 10250 | kubelet | kubelet服務 |
| TCP | 10251 | kube-scheduler | kube-scheduler服務 |
| TCP | 10252 | kube-controller-manager | kube-controller-manager服務 |
7.計算節點node概述
1)node節點的服務概述
Docker服務:
容器管理工具
kubelet服務
負責監控Pod,包括創建,修改,刪除等
kube-proxy服務
主要負責為pod對象提供代理
實現service(服務)的通信與負載均衡
2)pod的概述
-
Pod是Kuberbetes調度的基本單元
-
一個Pod包涵1個或多個容器
-
這些容器使用相同的網絡命名空間和端口
-
Pod是一個服務的多個進程的聚合單位
-
Pod作為一個獨立的部署單位,支持橫向擴展和復制
一個pod就是一個容器組類似豆夾,而里面的容器或服務則是豆子
二.私有鏡像倉庫
1.基礎了解
官網:https://kuberbetes.io/
官方下載地址: https://packages.cloud.google.com/
1)安裝部署方式
-
源碼安裝:下載源碼或編譯好的二進制,手工添加參數啟動服務,kuberbetes采用證書認證方式,需要創建大量證書
-
容器部署:官方把服務做成鏡像,下載鏡像,啟動即可
2)官方工具kubeadm的方式安裝
3)部署環境要求
-內核版本 >=3.10
-最低配置 2cpu,2G內存
-節點之中不可以有重復的主機名,MAC地址或product-uuid
-卸載防火墻 firewalld-*
-禁用 swap
-禁用 selinux
2.安裝倉庫
在docker進階文檔中有概述
1)客戶端倉庫配置文件概述
為docker配置私有倉庫,和cgroup控制器
-
kubelet使用的cgroup控制器是systemd,而docker使用的是cgroupfs,必須設置成統一的(查詢命令: docker info)
-
配置文件/etc/ docker /daemon. json
2)安裝倉庫
# 準備好yum源并安裝倉庫服務 ~]# yum makecache ~]# yum install -y docker-distribution ~]# systemctl enable --now docker-distribution3)使用腳本初始化倉庫
# 書寫腳本 ~]# vim init-img.sh #!/bin/bash # 安裝docker ~]# yum install -y docker-ce # 創建目錄指定遠程倉庫(指定cgroup驅動,指定國內倉庫,指定本地倉庫:端口,名稱) ~]# mkdir -p /etc/docker ~]# cat >/etc/docker/daemon.json <<'EOF' {"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://hub-mirror.c.163.com"],"insecure-registries":["192.168.1.100:5000", "registry:5000"] } EOF # docker重啟并設置開機自啟,導入docker進階中commint創建的docker鏡像 ~]# systemctl enable --now docker.service ~]# systemctl restart docker.service ~]# docker load -i myos.tar.gz ? # init apache images ~]# vim init-img.sh # 制作一個apache鏡像 #!/bin/bash cat >Dockerfile<<'EOF' FROM myos:latest ENV ?LANG=C WORKDIR /var/www/html/ EXPOSE 80 CMD ["/usr/sbin/httpd", "-DFOREGROUND"] EOF docker build -t 172.17.0.98:5000/myos:httpd . ? # init php-fpm images # 制作一個php-fpm鏡像 cat >Dockerfile<<'EOF' FROM myos:latest EXPOSE 9000 WORKDIR /usr/local/nginx/html CMD ["/usr/sbin/php-fpm", "--nodaemonize"] EOF docker build -t 172.17.0.98:5000/myos:php-fpm . ? # init nginx images # 制作一個nginx鏡像 cat >Dockerfile<<'EOF' FROM myos:latest EXPOSE 80 WORKDIR /usr/local/nginx/html CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"] EOF docker build -t 172.17.0.98:5000/myos:nginx . ? # upload images # 刪除dockerfile文件并給鏡像打標簽,上創倉庫 rm -f Dockerfile docker tag myos:latest 172.17.0.98:5000/myos:v1804 for i in v1804 httpd php-fpm nginx;dodocker push 192.168.1.100:5000/myos:${i} done ? # 創建目錄執行腳本 ~]# mkdir myos && cd myos ~]# chmod 755 init-img.sh ~]# ./init-img.sh # 測試鏡像(注意不能用“docker images”docker images 是看本地,curl才是看倉庫) ? ~]# curl http://172.17.0.98:5000/v2/myos/tags/list {"name":"myos","tags":["nginx","php-fpm","v1804","httpd"]}3.客戶端使用倉庫
# 創建存放json文件目錄 ~]# mkdir -p /etc/docker ~]# vim /etc/docker/daemon.json {"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://hub-mirror.c.163.com"],"insecure-registries":["172.17.0.98:5000", "registry:5000"] } # 測試訪問倉庫 ~]# curl http://172.17.0.98:5000/v2/myos/tags/list {"name":"myos","tags":["httpd","php-fpm","nginx","v1804"]} # 重啟docker生效 ~]# systemctl enable --now docker.service ~]# systemctl restart docker.service # 測試拉取 ~]# docker pull 172.17.0.98:5000/myos:httpd三.kubernetes 安裝
1.環境準備
按照如下配置準備服務器
-最低配置:2cpu,2G內存
-卸載防火墻firewalld-*
-禁用selinux和swap
-配置yum倉庫,安裝kubeadm,kubelet,kubectl,docker-ce
-配置docker私有鏡像倉庫和cgroup驅動(daemon.json)
-kuberbetes的master各個服務是運行在容器內的
-獲取鏡像的方式:
kubeadm config images list
2.安裝master
1)安裝部署工具
方法一
掛網下載地址:https://packages.cloud.google.com/
# 去官網把軟件包下載到本地,并拷貝到yum倉庫中 ~]# cp -a v1.17.6/k8s-install /var/ftp/localrepo/ ~]# cd /var/ftp/localrepo/ ~]# createrepo --update .方法二
# 導入阿里云的源 ~]# 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=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 # 設置開機自啟 ~]# systemctl enable kubelet # 列出所有版本2)master軟件包概述
-
kubeadm:用來初始化集群的指令
-
kubelet:在集群中的每個節點上用來啟動pod和容器的監控程序后臺進程
-
kubectl:用來與集群通信的命令行工具
-
docker:容器管理工具
3)安裝工具軟件包并指定私有鏡像倉庫
# 刷新緩存安裝kubeadm、kubectl、kubelet、docker-ce ~]# yum makecache ~]# yum install -y kubeadm kubelet kubectl docker-ce # 創建docker目錄用來存放文件(指定cgroup啟動器,與鏡像倉庫) ~]# mkdir -p /etc/docker ~]# vim /etc/docker/daemon.json {"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://hub-mirror.c.163.com"],"insecure-registries":["172.17.0.98:5000", "registry:5000"] } # 啟動docker與kubelet并設置開機自啟 ~]# systemctl enable --now docker kubelet # 指定鏡像倉庫重啟docker生效 ~]# systemctl enable --now docker.service ~]# systemctl restart docker.service ? # 查看cgroup的啟動器 ~]# docker info | grep Cgroup4)Tab鍵設置
# 默認kubectl與kubeadm不支持Tab,所以要生成兩個文件 ~]# kubectl completion bash > /etc/bash_completion.d/kubectl ~]# kubeadm completion bash > /etc/bash_completion.d/kubeadm5)下載kubernetes的鏡像
# 先查看要哪些鏡像,默認查看官網 ~]# kubeadm config images list k8s.gcr.io/kube-apiserver:v1.23.2 k8s.gcr.io/kube-controller-manager:v1.23.2 k8s.gcr.io/kube-scheduler:v1.23.2 k8s.gcr.io/kube-proxy:v1.23.2 k8s.gcr.io/pause:3.6 k8s.gcr.io/etcd:3.5.1-0 k8s.gcr.io/coredns/coredns:v1.8.6 # 下載上面列出的所有鏡像 ~]# docker pull xxx # 注意此時是pull不下來的,該網站被國內禁了的,只有·找國內網站,要么科學上網 ? ## 第一種方法下好放本地 # 這邊提前下載好了 ~]# mkdir k8s ~]# tar -xf k8s.tar -C k8s ~]# cd k8s/ ~]# ls coredns.tar.gz kube-apiserver.tar.gz ? ? ? ? ? kube-proxy.tar.gz ? ? pause.tar.gz etcd.tar.gz ? ? kube-controller-manager.tar.gz kube-scheduler.tar.gz # 一鍵導入下好的鏡像 ~]# ls | xargs -i docker load -i {} ? ## 第二種用國內的 ~]# kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers ? # 載入鏡像 ~]# docker load -i pause.tar.gz # 打上標簽,名稱標簽不能改(程序設定)(pause 3.1這就是名稱標簽) ~]# docker images REPOSITORY ? ? ? TAG IMAGE ID ? ? ? CREATED ? ? ? SIZE k8s.gcr.io/pause 3.1 da86e6ba6ca1 ? 4 years ago ? 742kB ~]# docker tag k8s.gcr.io/pause:3.1 172.17.0.98:5000/pause:3.1 ~]# docker images REPOSITORY ? ? ? ? ? ? TAG IMAGE ID ? ? CREATED ? ? ? SIZE 172.17.0.98:5000/pause 3.1 da86e6ba6ca1 4 years ago ? 742kB ? # 腳本一鍵導入鏡像倉庫 ~]# docker images | awk '$2!="TAG"{print $1,$2}'|while read _f _v; do docker tag ${_f}:${_v} 172.17.0.98:5000/${_f##*/}:${_v}; docker push 172.17.0.98:5000/${_f##*/}:${_v}; docker rmi ${_f}:${_v}; done # 查看倉庫 ~]# curl http://172.17.0.98:5000/v2/_catalog6)安裝IPVS負載均衡與概述
概述
kube-proxy是什么
-
kube-proxy是實現kubernetes Service的通信與負載均衡機制的重要組件,是kubernetes的核心組件
kube-proxy代理模式
-
kubernetes v1.0,用戶空間代理模式
-
kubernetes v1.1,iptables模式代理
-
kubernetes v1.8,ipvs代理模式,如果不滿足條件退回至iptables的代理模式
如和啟用IPVS模式
-
內核必須支持ip_vs,ip_vs_rr,ip_vs_wrr,ip_vs_sh,nf_conntrack_ipv4
-
必須有ipvsadm和ipset軟件包
-
配置文件中開啟IPVS參數
-
mode:ipvs
7)配置master主機環境
# 配置主機hosts ~]# vim /etc/hosts 172.17.0.51 master 172.17.0.114 node1 172.17.0.142 node2 172.17.0.98 registry ~]# ping -w4 node1 && ping -w4 node1 && ping -w4 master && ping -w4 registry # 配置網橋監控主機流量,主機路由轉發(文件不存在需創建) ~]# vim /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 ? # 加載主機模塊 ~]# modprobe br_netfilter(開啟netfilter對bridge設備的監控) ~]# sysctl --system ..... * Applying /etc/sysctl.d/k8s.conf ... net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 18)使用kubeadm部署
kubeadm 命令
-config: ? 配置管理命令 -help: ? ? 查看幫助 -init: ? ? 初始命令 -join: ? ? ?node加入集群的命令 -reset: ? ? 還原狀態命令 -token: ? ? token憑證管理命令 -version: ? 查看版本安裝master
~]# mkdir init;cd init # 生成應答文件 ~]# kubeadm config print init-defaults > kubeadm-init.yaml ? ## 查找ipvs啟動kind后續寫到問件里 # 查看查找方式 ~]# kubeadm config print init-defaults --help --component-configs ... values: [KubeProxyConfiguration KubeletConfiguration]. ... # 利用查找方式查找kind與ipvserion ~ ]# kubeadm config print init-defaults --component-configs KubeProxyConfiguration ..... apiVersion: kubeproxy.config.k8s.io/v1alpha1 .... kind: KubeProxyConfiguration .... ? # 修改應答文件 ~]# vim kubeadm-init.yaml apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0s ?# token生命周期usages:- signing- authentication kind: InitConfiguration localAPIEndpoint:advertiseAddress: 172.17.0.51# apiserver地址,修改成本地的apiserverbindPort: 6443 nodeRegistration:criSocket: /var/run/dockershim.sockname: mastertaints:- effect: NoSchedulekey: node-role.kubernetes.io/master --- apiServer:timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns:type: CoreDNS etcd:local:dataDir: /var/lib/etcd imageRepository: 172.17.0.98:5000# 鏡像地址,需需修改 kind: ClusterConfiguration kubernetesVersion: v1.23.2 ?# 版本一定要和鏡像一致,不然后續會報錯 networking:dnsDomain: cluster.local#需修改成自己的域名如:(xxx.163.com),沒有用默認的也行podSubnet: 10.244.0.0/16 # 添加一行并配置pod的ip段(不要沖突)serviceSubnet: 10.254.0.0/16# 配置service的ip段 scheduler: {} --- # 開啟ipvs把找到的kind與api放入 apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs ? # 初始化master ~]# kubeadm init --config=kubeadm-init.yaml |tee master-init.log # 初始化master并把日志拷貝到一個文件中 Your Kubernetes control-plane has initialized successfully! ? To start using your cluster, you need to run the following as a regular user: ?mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config ? Alternatively, if you are the root user, you can run: ?export KUBECONFIG=/etc/kubernetes/admin.conf ? You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/ ? Then you can join any number of worker nodes by running the following on each as root: ? kubeadm join 172.17.0.51:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:72db7edc40a9581a8e9f96853a4e3fb03e48cceb24bbb51fcaa1cd1123e3ba09根據提示執行命令
~]# mkdir -p $HOME/.kube ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ~]# chown $(id -u):$(id -g) $HOME/.kube/config # 測試 ? NAME ? ? STATUS ? ? ROLES ? ? ? ? ? ? ? ? AGE ? VERSION master ? NotReady ? control-plane,master ? 14m ? v1.23.29)驗證安裝結果
~]# kubectl get nodes NAME ? STATUS ? ROLES ? ? ? ? ? ? ? ? AGE ? ? VERSION master NotReady control-plane,master ? 14m ? v1.23.2 ? ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.2", GitCommit:"9d142434e3af351a628bffee3939e64c681afa4d", GitTreeState:"clean", BuildDate:"2022-01-19T17:35:46Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.2", GitCommit:"9d142434e3af351a628bffee3939e64c681afa4d", GitTreeState:"clean", BuildDate:"2022-01-19T17:29:16Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"} ? ~]# kubectl get componentstatuses NAME ? ? ? ? ? ? ? ? STATUS ? MESSAGE ? ? ? ? ? ? ? ? ? ? ? ? ERROR controller-manager ? Healthy ? ok ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? scheduler ? ? ? ? ? Healthy ? ok ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? etcd-0 ? ? ? ? ? ? ? Healthy ? {"health":"true","reason":""} ?3.node節點加入集群
1)node節點如何加入集群
-
從master的安裝日志里查找安裝指令樣例
-
node節點加入集群必須有master提供的token
2)token管理
如何獲取token
管理token使用kubeadm token指令
# 查看日志文件(hash) ~]# cat master-init.log .... Then you can join any number of worker nodes by running the following on each as root: # 要想加入集群則要執行以下操作 kubeadm join 172.17.0.51:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:72db7edc40a9581a8e9f96853a4e3fb03e48cceb24bbb51fcaa1cd1123e3ba093)獲取token與刪除token
# 列出token ~]# kubeadm token list TOKEN ? ? ? ? ? ? ? ? ? TTL EXPIRES ? ? ? ? ? ? ? USAGES DESCRIPTION ? EXTRA GROUPS abcdef.0123456789abcdef 22h ?2022-01-23T08:33:52Z ...... <none> ? ? .... # (EXPIRES)發現token明天就會過期,所以這里就不要了重新創建token # 刪除token ~]# kubeadm token delete < token> ~]# kubeadm token delete abcdef.0123456789abcdef4)創建token
# 重新創建token ~]# kubeadm token create --ttl: 設置壽命(周期時間 0:無限) --print-join-command: 打印如和使用token ~]# kubeadm token create --ttl=0 --print-join-command kubeadm join 172.17.0.51:6443 --token 03xc0f.hnul7g7yf6xo6s5x --discovery-token-ca-cerhash sha256:72db7edc40a9581a8e9f96853a4e3fb03e48cceb24bbb51fcaa1cd1123e3ba09 ~]# kubeadm token list TOKEN ? TTL EXPIRES USAGES ? DESCRIPTION ? EXTRA GROUPS 03xc0f.hnul7g7yf6xo6s5x ? <forever> ? <never> ? authentication,signing ? <none> ? ? ? ? ? system:bootstrappers:kubeadm:default-node-ken # forever無限 # 找一個本記住sha256與token #sha256:72db7edc40a9581a8e9f96853a4e3fb03e48cceb24bbb51fcaa1cd1123e3ba09 # 03xc0f.hnul7g7yf6xo6s5x5)獲取token_hash
# 如果實在找不到就用 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt |openssl rsa -pubin -outform der | openssl dgst -sha256 -hex writing RSA key (stdin)= 72db7edc40a9581a8e9f96853a4e3fb03e48cceb24bbb51fcaa1cd1123e3ba09 ## 注:書寫hash(哈希)時sha256也要xxxxxxxxxx?# 如果實在找不到就用~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt |openssl rsa -pubin -outform der | openssl dgst -sha256 -hexwriting RSA key(stdin)= 72db7edc40a9581a8e9f96853a4e3fb03e48cceb24bbb51fcaa1cd1123e3ba09 ## 注:書寫hash(哈希)時sha256也要6)node安裝
-
初始化
卸載防火墻firewalld-*
禁用selinux和swap
配置yum倉庫,安裝kubeadm、kubelet、 docker-ce-安裝IPVS模式軟件包ipvsadm、 ipset
配置docker私有鏡像倉庫和cgroup驅動(daemon. json)-配置內核參數(/etc/sysctI. d/k8s. conf)
配置etc/hosts (master能訪問node的主機名 )
1.利用ansibe一鍵安裝node
注:用ansible可能會遇到的問題,清空 /root/.ssh/known
## 安裝與配置ansible # 先修改主機名稱 ~]# hostnamectl set-hostname node1 # (其他幾個都要需改) ~]# ssh-keygen ~]# ssh-copy-id [所有節點] ~]# yum -y install ansible ~]# mkdir ansible && cd ansible # 書寫配置文件 ~]# vim ansible.cfg [defaults] inventory = hostlist.yaml host_key_checking = False # 準備需要的文件(指定倉庫文件,hosts文件,開啟轉發與監控文件,kubernetes的基礎鏡像) ~]# mkdir files && cd files ~]# cp /etc/docker/daemon.json daemon.json ~]# cp /etc/hosts hosts ~]# cp /etc/sysctl.d/k8s.conf k8s.conf ~]# vim images.sh #!/bin/bash systemctl restart docker docker pull 172.17.0.98:5000/kube-apiserver:v1.23.2 docker pull 172.17.0.98:5000/kube-controller-manager:v1.23.2 docker pull 172.17.0.98:5000/kube-scheduler:v1.23.2 docker pull 172.17.0.98:5000/kube-proxy:v1.23.2 docker pull 172.17.0.98:5000/etcd:3.5.1-0 docker pull 172.17.0.98:5000/coredns:v1.8.6 docker pull 172.17.0.98:5000/pause:3.6 ? # 書寫地址庫yaml ~]# cd .. ~]# vim hostlist.yaml all:children:nodes:hosts:172.17.0.114: {} ?# 填寫ip(可多個)172.17.0.98: {}ungrouped: {} # 測試聯通性 ~]# ansible nodes -m ping ? # 書寫安裝node的playbook ~]# vim node_install.yaml --- - name:hosts:- nodesvars:master: '192.168.1.21:6443' ?# 指定master機器token: 'fm6kui.mp8rr3akn74a3nyn' ?# master機器的token與hashtoken_hash: 'sha256:f46dd7ee29faa3c096cad189b0f9aedf59421d8a881f7623a543065fa6b0088c' tasks:- name: disable swap # 第一個任務關閉swaplineinfile:path: /etc/fstabregexp: 'swap'state: absentnotify: disable swap- name: Ensure SELinux is set to disabled mode ?# 第二個任務關閉SELINUXlineinfile:path: /etc/selinux/configregexp: '^SELINUX='line: SELINUX=disablednotify: disable selinux- name: remove the firewalld # 第三個任務卸載firewalld yum:name:- firewalld - firewalld-filesystemstate: absent- name: daojian yum ?# 搭建yumcopy:src: /etc/yum.repos.d/kubernetes.repo dest: /etc/yum.repos.d/kubernetes.repo- name: install k8s node tools # 安裝k8s所需服務(kubectl是控制節點,只在主上安裝)yum:name:- kubeadm- kubelet- docker-ce- ipvsadm- ipsetstate: presentupdate_cache: yes- name: Create a directory if it does not exist # 創建一個目錄file:path: /etc/dockerstate: directorymode: '0755'- name: Copy file with /etc/hosts # 配置hostcopy:src: files/hostsdest: /etc/hostsowner: rootgroup: rootmode: '0644'- name: Copy file with /etc/docker/daemon.json # 拷貝文件到在上面創建的docker目錄中copy:src: files/daemon.jsondest: /etc/docker/daemon.jsonowner: rootgroup: rootmode: '0644' ?notify: sys- name: Copy file with images # 把要的基礎鏡像名稱放到文件中copy:src: files/images.shdest: /root/images.showner: rootgroup: rootmode: '0655'notify: shell test- name: Copy file with /etc/sysctl.d/k8s.conf # 拷貝網橋監控主機流量,主機路由轉發文件copy:src: files/k8s.confdest: /etc/sysctl.d/k8s.confowner: rootgroup: rootmode: '0644'notify: enable sysctl args- name: enable k8s node service # 啟動看k8s與dockerservice:name: "{{ item }}"state: startedenabled: yeswith_items:- docker- kubelet- name: check node state # vim stat:path: /etc/kubernetes/kubelet.confregister: result- name: node join ? ?# 加入集群shell: kubeadm join '{{ master }}' --token '{{ token }}' --discovery-token-ca-cert-hash '{{ token_hash }}'when: result.stat.exists == Falsehandlers: ?# notify創建觸發命令- name: disable swapshell: swapoff -a- name: disable selinuxshell: setenforce 0- name: enable sysctl argsshell: sysctl --system- name: sysshell: systemctl restart docker- name: shell testshell: /root/images.sh驗證安裝
# 在master機器上查看 ~]# kubectl get nodes NAME ? ? ? ? ? ? STATUS ? ? ROLES ? ? ? ? ? ? ? ? AGE ? ? VERSION master ? ? ? ? ? NotReady ? control-plane,master ? 46h ? ? v1.23.2 vm-0-114-centos ? NotReady ? <none> ? ? ? ? ? ? ? ? 3h55m ? v1.23.2 vm-0-142-centos ? NotReady ? <none> ? ? ? ? ? ? ? ? 3h19m ? v1.23.24.k8s網絡插件安裝配置
1)flannel概述
-
Flannel實質是一種“覆蓋網絡(overlay network)”,也就是將TCP數據包裝在另一種網絡包里面進行路由轉發和通信,目前已經支持UDP,VxLAN,AWS,VPC和GCE路由等數據轉發方式
-
使用flannel使不同的容器實現互聯互通
flannel架構圖
?
軟件地址:https://github.com/coreos/flannel
資源文件 kube-flannel.yml
鏡像文件 flannel.tar.gz
2)準備資源
-
資源文件
-
鏡像文件
3)修改配置文件并安裝
## yml修改配置 # 先查看pod分配的網段 ~]# cat config/kubeadm-init.yaml | grep podSubnetpodSubnet: 10.244.0.0/16 ? # 修改flannel的yml文件 ~]# vim kube-flannel.yml 128: "Network": "10.244.0.0/16", ?# 這一上的podip必須與kubeadm的啟動配置文件必須一致 ? # 如果不能聯網的話改成私有倉庫地址,可以聯網則忽略 169 :192.168.1.100:5000/mirrored-flannelcni-flannel-cni-plugin:v1.0.0 172: image: 192.168.1.100:5000/flannel:v0.12.0-amd64 ? 194: image: 192.168.1.100:5000/flannel:v0.12.0-amd64 237-結尾: 刪除 ?# arm是嵌入式的服務 ? # 啟動flannel ~]# kubectl apply -f kube-flannel.yml4)驗證結果
~]# kubectl get nodes NAME ? ? ? ? ? ? STATUS ? ? ROLES ? ? ? ? ? ? ? ? AGE ? VERSION master ? ? ? ? ? Ready ? ? control-plane,master ? 2d6h ? v1.23.2 vm-0-114-centos ? Ready ? ? <none> ? ? ? ? ? ? ? ? 12h ? v1.23.2 vm-0-142-centos ? Ready ? ? <none> ? ? ? ? ? ? ? ? 12h ? v1.23.2 ~]# kubectl get pods -A總結
以上是生活随笔為你收集整理的kuberbetes的架构与kubernetets集群搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部署Dashboard图形界面控制doc
- 下一篇: k8s安装Prometheus