云原生與k8s集群構(gòu)建全過(guò)程
一、云原生和kubernetes
1、云原生的概念
云是和本地相對(duì)的,傳統(tǒng)的應(yīng)用必須跑在本地服務(wù)器上,現(xiàn)在流行的應(yīng)用都跑在云端,云包含了IaaS、PaaS和SaaS。原生就是土生土長(zhǎng)的意思,我們?cè)陂_(kāi)始設(shè)計(jì)應(yīng)用的時(shí)候就考慮到應(yīng)用將來(lái)是運(yùn)行云環(huán)境里面的,要充分利用云資源的優(yōu)點(diǎn),比如?云服務(wù)的彈性和分布式優(yōu)勢(shì)。
云原生是基于分布部署和統(tǒng)一運(yùn)管的云端服務(wù),以容器、微服務(wù)、DevOps等技術(shù)為基礎(chǔ)建立的一套云技術(shù)產(chǎn)品體系。云原生指的是一個(gè)靈活的工程團(tuán)隊(duì),遵循敏捷的研發(fā)原則,使用高度自動(dòng)化的研發(fā)工具,開(kāi)發(fā)專(zhuān)門(mén)基于并部署在云基礎(chǔ)設(shè)施上的應(yīng)用,以滿足快速變化的客戶(hù)需求。這些應(yīng)用采用自動(dòng)化的,可擴(kuò)展的,和高可用的架構(gòu)。這個(gè)工程團(tuán)隊(duì)通過(guò)高效的云計(jì)算現(xiàn)網(wǎng)的運(yùn)維來(lái)提供這一應(yīng)用服務(wù),并且根據(jù)線上反饋對(duì)服務(wù)進(jìn)行不斷地改進(jìn)。
2、云原生的組成
云原生 = 微服務(wù) + DevOps + 持續(xù)交付 + 容器化。
微服務(wù)是一種軟件開(kāi)發(fā)技術(shù),它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶(hù)提供最終價(jià)值。微服務(wù)體系結(jié)構(gòu)有許多重要的好處。首先,它解決了業(yè)務(wù)復(fù)雜性的問(wèn)題。它將原來(lái)龐大的單個(gè)應(yīng)用程序分解為一組服務(wù)。盡管功能的總數(shù)保持不變,但應(yīng)用程序已被分解為可管理的服務(wù)。單個(gè)服務(wù)的開(kāi)發(fā)速度要快得多,而且更容易理解和維護(hù)。其次,這種架構(gòu)允許每個(gè)服務(wù)由一個(gè)團(tuán)隊(duì)獨(dú)立開(kāi)發(fā)。開(kāi)發(fā)人員可以自由選擇任何適當(dāng)?shù)募夹g(shù)。第三,微服務(wù)架構(gòu)模式允許各個(gè)服務(wù)獨(dú)立部署。開(kāi)發(fā)人員永遠(yuǎn)不需要協(xié)調(diào)對(duì)其服務(wù)的本地更改的部署。這些類(lèi)型的更改可以在測(cè)試后立即部署。最后,微服務(wù)體系結(jié)構(gòu)允許每個(gè)服務(wù)獨(dú)立擴(kuò)展。
DevOps的意思就是開(kāi)發(fā)和運(yùn)維不再是分開(kāi)的兩個(gè)團(tuán)隊(duì),而是你中有我,我中有你的一個(gè)團(tuán)隊(duì)。我們現(xiàn)在開(kāi)發(fā)和運(yùn)維已經(jīng)是一個(gè)團(tuán)隊(duì)了,但是運(yùn)維方面的知識(shí)和經(jīng)驗(yàn)還需要持續(xù)提高。
持續(xù)交付的意思就是在不影響用戶(hù)使用服務(wù)的前提下頻繁把新功能發(fā)布給用戶(hù)使用,要做到這點(diǎn)非常非常難。我們現(xiàn)在兩周一個(gè)版本,每次上線之后都會(huì)給不同的用戶(hù)造成不同程度的影響。
容器化的好處在于運(yùn)維的時(shí)候不需要再關(guān)心每個(gè)服務(wù)所使用的技術(shù)棧了,每個(gè)服務(wù)都被無(wú)差別地封裝在容器里,可以被無(wú)差別地管理和維護(hù),現(xiàn)在比較流行的工具是docker和k8s。
3、云原生與k8s
k8s是云原生的重要組成部分, k8s由Node、Pod、Service、Volume、Label等組成。
Master
- 集群控制節(jié)點(diǎn),每個(gè)集群需要至少一個(gè)master節(jié)點(diǎn)負(fù)責(zé)集群的管控;
Node
- 工作負(fù)載節(jié)點(diǎn),由master分配容器到這些node工作節(jié)點(diǎn)上,然后node節(jié)點(diǎn)上的docker 負(fù)責(zé)容器的運(yùn)行,運(yùn)行真正的應(yīng)用程序,在Node上Kubernetes管理的最小運(yùn)行單元是Pod。
- Node上運(yùn)行著Kubernetes的Kubelet、kube-proxy服務(wù)進(jìn)程,這些服務(wù)進(jìn)程負(fù)責(zé)Pod的創(chuàng)建、啟動(dòng)、監(jiān)控、重啟、銷(xiāo)毀、以及實(shí)現(xiàn)軟件模式的負(fù)載均衡。
Node包含的信息:
- Node地址:主機(jī)的IP地址,或Node ID。
- Node的運(yùn)行狀態(tài):Pending、Running、Terminated三種狀態(tài)。
- Node系統(tǒng)容量(Node Condition):描述Node可用的系統(tǒng)資源,包括CPU、內(nèi)存、最大可調(diào)度Pod數(shù)量等。
- 其他:內(nèi)核版本號(hào)、Kubernetes版本等。
Pod
- Pod是Kubernetes最基本的操作單元,包含一個(gè)或多個(gè)緊密相關(guān)的容器,一個(gè)Pod可以被一個(gè)容器化的環(huán)境看作應(yīng)用層的“邏輯宿主機(jī)”;
- 一個(gè)Pod中的多個(gè)容器應(yīng)用通常是緊密耦合的,Pod在Node上被創(chuàng)建、啟動(dòng)或者銷(xiāo)毀;每個(gè)Pod里運(yùn)行著一個(gè)特殊的被稱(chēng)之為Pause的容器,其他容器則為業(yè)務(wù)容器,這些業(yè)務(wù)容器共享Pause容器的網(wǎng)絡(luò)棧和Volume掛載卷,因此他們之間通信和數(shù)據(jù)交換更為高效,在設(shè)計(jì)時(shí)我們可以充分利用這一特性將一組密切相關(guān)的服務(wù)進(jìn)程放入同一個(gè)Pod中。同一個(gè)Pod里的容器之間僅需通過(guò)localhost就能互相通信。
一個(gè)Pod中的應(yīng)用容器共享同一組資源:
- PID命名空間:Pod中的不同應(yīng)用程序可以看到其他應(yīng)用程序的進(jìn)程ID;
- 網(wǎng)絡(luò)命名空間:Pod中的多個(gè)容器能夠訪問(wèn)同一個(gè)IP和端口范圍;
- IPC命名空間:Pod中的多個(gè)容器能夠使用SystemV IPC或POSIX消息隊(duì)列進(jìn)行通信;
- UTS命名空間:Pod中的多個(gè)容器共享一個(gè)主機(jī)名;
- Volumes(共享存儲(chǔ)卷):Pod中的各個(gè)容器可以訪問(wèn)在Pod級(jí)別定義的Volumes;Pod的生命周期通過(guò)Replication Controller來(lái)管理;通過(guò)模板進(jìn)行定義,然后分配到一個(gè)Node上運(yùn)行,在Pod所包含容器運(yùn)行結(jié)束后,Pod結(jié)束。
Controller
- 控制器,通過(guò)它來(lái)實(shí)現(xiàn)對(duì)pod的管理,比如啟動(dòng)、停止、伸縮pod的數(shù)量。
Service
pod對(duì)外服務(wù)的統(tǒng)一入口,下面可以維護(hù)者同一類(lèi)的多個(gè)pod。在Kubernetes的世界里,雖然每個(gè)Pod都會(huì)被分配一個(gè)單獨(dú)的IP地址,但這個(gè)IP地址會(huì)隨著Pod的銷(xiāo)毀而消失,這就引出一個(gè)問(wèn)題:
- 如果有一組Pod組成一個(gè)集群來(lái)提供服務(wù),那么如何來(lái)訪問(wèn)它呢?Service!一個(gè)Service可以看作一組提供相同服務(wù)的Pod的對(duì)外訪問(wèn)接口,Service作用于哪些Pod是通過(guò)Label Selector來(lái)定義的。擁有一個(gè)指定的名字(比如my-mysql-server);
- 擁有一個(gè)虛擬IP(Cluster IP、Service IP或VIP)和端口號(hào),銷(xiāo)毀之前不會(huì)改變,只能內(nèi)網(wǎng)訪問(wèn);
- 能夠提供某種遠(yuǎn)程服務(wù)能力;被映射到了提供這種服務(wù)能力的一組容器應(yīng)用上;
- 如果Service要提供外網(wǎng)服務(wù),需指定公共IP和NodePort,或外部負(fù)載均衡器;
- NodePort 系統(tǒng)會(huì)在Kubernetes集群中的每個(gè)Node上打開(kāi)一個(gè)主機(jī)的真實(shí)端口,這樣,能夠訪問(wèn)Node的客戶(hù)端就能通過(guò)這個(gè)端口訪問(wèn)到內(nèi)部的Service了
Label
- 標(biāo)簽,用于對(duì)pod進(jìn)行分類(lèi),同一類(lèi)pod會(huì)擁有相同的標(biāo)簽。
- Label以key/value的形式附加到各種對(duì)象上,如Pod、Service、RC、Node等,以識(shí)別這些對(duì)象,管理關(guān)聯(lián)關(guān)系等,如Service和Pod的關(guān)聯(lián)關(guān)系。
NameSpace
- 命名空間,用來(lái)隔離pod的運(yùn)行環(huán)境。
二、k8s集群搭建
集群架構(gòu)圖
1、系統(tǒng)環(huán)境準(zhǔn)備
三臺(tái)centos7虛擬機(jī),主機(jī)名分別為master(192.168.2.8)、slave1(192.168.2.9)、 slave2(192.168.2.10),并安裝好docker環(huán)境, docker安裝成功后檢測(cè)如下:
安裝好docker后,進(jìn)行如下設(shè)置
關(guān)閉 防火墻 、selinux、swap分區(qū)
systemctl stop firewalld && systemctl disable firewalld sed -i 's/enforcing/disabled/' /etc/selinux/config sed -ri 's/.*swap.*/#&/' /etc/fstab
將橋接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 (sysctl -p /etc/sysctl.d/k8s.conf)
同步主機(jī)的時(shí)間
yum install ntpdate -y ntpdate -u time.windows.com
生成CA秘鑰、Certificates證書(shū)
在master節(jié)點(diǎn)安裝CFSSL工具用來(lái)建立TLS certificates
export CFSSL_URL="https://pkg.cfssl.org/R1.2" wget "${CFSSL_URL}/cfssl_linux-amd64" -O /usr/local/bin/cfssl wget "${CFSSL_URL}/cfssljson_linux-amd64" -O /usr/local/bin/cfssljson chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson
在/etc/etcd/ssl目錄下創(chuàng)建ca-config.json、etcd-ca-csr.json秘鑰配置用于生成CA的秘鑰。etcd-csr.json秘鑰配置用于生成Certificate證書(shū)
mkdir -p /etc/etcd/ssl && cd /etc/etcd/ssl #ca-config.json { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } } #etcd-ca-csr.json { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "CN", "ST": "HeNan", "L": "ZhengZhou", "O": "k8s", "OU": "wmy" }] } #etcd-csr.json 其中hosts為集群的ip { "CN": "etcd", "key": { "algo": "rsa", "size": 2048 }, "hosts": [ "127.0.0.1", "192.168.2.8", "192.168.2.9", "192.168.2.10" ], "names": [ { "C": "CN", "L": "ZhengZhou", "O": "etcd", "OU": "etcd Security", "ST": "ZhengZhou" } ] }
生成CA秘鑰文件
cfssl gencert -initca etcd-ca-csr.json | cfssljson -bare etcd-ca
?? 生成 kube-apiserver certificate 證書(shū)
cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
最終生產(chǎn)5個(gè)證書(shū)文件
將5個(gè)文件分發(fā)到salve1 、salve2相應(yīng)的目錄上
scp -r /etc/etcd/ssl root@slave1:/etc/etcd/ssl scp -r /etc/etcd/ssl root@slave2:/etc/etcd/ssl
2、k8s集群部署
添加阿里云的鏡像源
cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF 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 #exclude= kubeadm kubelet kubectl EOF
安裝 kubeadm,kubelet 、kubectl
其中kubelet分布在集群中的每個(gè)節(jié)點(diǎn),負(fù)責(zé)啟動(dòng)pod容器,kubeadm用于初始化k8s集群, kubectl用于增刪查各種k8s的資源的工具類(lèi)。
#cnetos安裝 yum install -y kubelet-1.23.15 kubeadm-1.23.15 kubectl-1.23.15 systemctl enable kubelet --now
注:如果kubelet無(wú)法正常啟動(dòng)(journalctl -xeu kubelet 查看啟啟動(dòng)日志),一般情況下檢查一下/etc/docker/daemon.json是否存在以下配置:
"exec-opts": [ "native.cgroupdriver=systemd" ],
修改后重啟docker: systemctl restart docker
部署Kubernetes Master
在 192.168.2.8(Master)執(zhí)行為了提高安裝成功率,安裝之前先做一次重置,指定阿里 云鏡像倉(cāng)庫(kù)地址
kubeadm reset #替換鏡像地址 kubeadm config images list kubeadm config images list --image-repository registry.aliyuncs.com/google_containers #拉鏡像 kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
集群主機(jī)節(jié)點(diǎn)初始化操作
kubeadm init \ --apiserver-advertise-address=192.168.2.8 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.15 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --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
主節(jié)點(diǎn)初始化成功后,下載安裝 Pod 網(wǎng)絡(luò)插件(cni-plugins-linux-amd64-v1.1.1.tgz)
mkdir -p /opt/cni/bin tar -C /opt/cni/bin -zxvf cni-plugins-linux-amd64-v1.1.1.tgz yum install kubernetes-cni -y
網(wǎng)絡(luò)cni有多重方式,這里提供兩種fannel 和calico
##fannel方式 wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml kubectl apply –f kube-fannel.yml ------------------------------------------------------------------------------------ ##calico方式 wget https://docs.projectcalico.org/manifests/calico.yaml 將calico.yaml中引用的鏡像提前拉取 docker pull docker.io/calico/node:v3.26.1 docker pull docker.io/calico/kube-controllers:v3.26.1 docker pull docker.io/calico/cni:v3.26.1 修改calico.yaml中CALICO_IPV4POOL_CIDR的網(wǎng)段與集群初始化時(shí)候的保持一直 - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16" kubectl apply –f calico.yaml
初始化工作節(jié)點(diǎn)
向集群添加新節(jié)點(diǎn),執(zhí)行在 kubeadm init 輸出的 kubeadm join 命令(證書(shū)在master安裝
后會(huì) 直接顯示出來(lái),直接拷貝過(guò)來(lái))
kubeadm join 192.168.2.8:6443 --token 7s9vq1.4d5kp8yubatwjzgr --discovery-token-ca-cert-hash sha256:5b042272bbd8b8692581202ba7dba8e1721078facb40878485d40bde8b1d986e --ignore-preflight-errors=all
注:如果token過(guò)期可以使用以下方式創(chuàng)建查詢(xún)
#查看token kubeadm token list #創(chuàng)建token kubeadm token create --print-join-command
查看k8s集群
kubectl get nodes
如果節(jié)點(diǎn)的狀態(tài)為NotReady,查詢(xún)?nèi)罩具M(jìn)行排查:
journalctl -f -u kubelet.service kubectl describe node nodename
驗(yàn)證k8s集群環(huán)境
在 Kubernetes 集群中創(chuàng)建一個(gè) pod,安裝nignx鏡像容器
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get pod,svc
注:可以通過(guò)下面的方式生成部署的yaml文件
kubectl create deployment nginx --image=nginx --dry-run -o yaml
查看nignx的端口
訪問(wèn)nignx的默認(rèn)頁(yè)面 http://192.168.2.8:31521
kubernetes-dashboard安裝
命令行操作不是很方便,可以安裝部署kubepi可視化操作
docker pull kubeoperator/kubepi-server docker run --privileged -itd --restart=unless-stopped --name kube_dashboard -v /home/docker-mount/kubepi/:/var/lib/kubepi/ -p 7110:80 kubeoperator/kubepi-server
創(chuàng)建訪問(wèn)賬戶(hù)、獲取訪問(wèn)令牌
#創(chuàng)建sa賬戶(hù) kubectl create sa kubepi-user --namespace kube-system #分配角色 kubectl create clusterrolebinding kubepi-user --clusterrole=cluster-admin --serviceaccount=kube-system:kubepi-user #查詢(xún)?cè)L問(wèn)令牌token kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubepi-user | awk '{print $1}') | grep token: | awk '{print $2}' #獲取集群地址 cat ~/.kube/config | grep server: | awk '{print $2}'
訪問(wèn)dashboard管理頁(yè)面(http://master:7110/ ),默認(rèn)賬密(admin/kubepi)
三、k8s常用命令
#開(kāi)機(jī)自啟 systemctl enable kubelet #禁用自啟 systemctl disable kubelet #刪除從節(jié)點(diǎn) kubelet delete node slave1 #創(chuàng)建命名空間 kubectl create namespace ns-test #查看節(jié)點(diǎn) kubectl get nodes kubectl get node -A #查看執(zhí)行任務(wù) kubectl get job -n ns-test #查詢(xún)pods kubectl get pods -A kubectl get pods -n kube-ns-test -o wide #查詢(xún)部署情況 kubectl describe ndoe nodeNamekueb kubectl describe -n ns-test svc <service名> kubectl describe -n ns-test deployment <deployment名> kubectl describe -n ns-test pod <pod名> #查詢(xún)持久卷 kubectl get pv -A #查詢(xún)持久卷聲明 kubectl get -n ns-test pvc #查詢(xún)存儲(chǔ)類(lèi)型 kubectl get storageclass -A #副本擴(kuò)容 kubectl scale --replicas=3 dev #查看服務(wù)信息 kubectl get svc -A #查看服務(wù)日志 kubectl logs -f -n ns-test <pod名> #服務(wù)交互 kubectl exec -it -n ns-test <pod名> /bin/bash #刪除pod deployment service kubectl delete -n ns-test pod <pod名> kubectl delete -n ns-test deployment <deployment名> kubectl delete -n ns-test svc <service名>
四、k8s集群卸載
- k8s 卸載
kubeadm reset -f yum remove -y kubelet kubeadm kubectl modprobe -r ipip lsmod
- 刪除配置文件
rm -rf ~/.kube/ rm -rf /etc/kubernetes/ rm -rf /etc/systemd/system/kubelet.service.d rm -rf /etc/systemd/system/kubelet.service rm -rf /usr/bin/kube* rm -rf /etc/cni rm -rf /opt/cni rm -rf /var/lib/etcd rm -rf /var/etcd
- 更新鏡像
yum clean all yum makecache
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于CentOS7日志文件及journalctl日志查看方法
這篇文章主要介紹了關(guān)于CentOS7日志文件及journalctl日志查看方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03kubernetes部署dashboard及應(yīng)用小結(jié)
Dashboard?是基于網(wǎng)頁(yè)的?Kubernetes?用戶(hù)界面,可以對(duì)?Deployment?實(shí)現(xiàn)彈性伸縮、發(fā)起滾動(dòng)升級(jí)、重啟?Pod?或者使用向?qū)?chuàng)建新的應(yīng)用,這篇文章主要介紹了kubernetes部署dashboard,需要的朋友可以參考下2024-06-06K8S?實(shí)用工具之合并多個(gè)kubeconfig實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了K8S?實(shí)用工具之合并多個(gè)kubeconfig實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法
這篇文章主要介紹了某集團(tuán)任意文件下載到虛擬主機(jī)getshell的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01Kubernetes故障排除有效維護(hù)集群的最佳實(shí)踐工具
這篇文章主要為大家介紹了Kubernetes故障排除有效維護(hù)集群的最佳實(shí)踐工具詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10