云原生與k8s集群構(gòu)建全過程
一、云原生和kubernetes
1、云原生的概念
云是和本地相對的,傳統(tǒng)的應(yīng)用必須跑在本地服務(wù)器上,現(xiàn)在流行的應(yīng)用都跑在云端,云包含了IaaS、PaaS和SaaS。原生就是土生土長的意思,我們在開始設(shè)計應(yīng)用的時候就考慮到應(yīng)用將來是運行云環(huán)境里面的,要充分利用云資源的優(yōu)點,比如?云服務(wù)的彈性和分布式優(yōu)勢。
云原生是基于分布部署和統(tǒng)一運管的云端服務(wù),以容器、微服務(wù)、DevOps等技術(shù)為基礎(chǔ)建立的一套云技術(shù)產(chǎn)品體系。云原生指的是一個靈活的工程團隊,遵循敏捷的研發(fā)原則,使用高度自動化的研發(fā)工具,開發(fā)專門基于并部署在云基礎(chǔ)設(shè)施上的應(yīng)用,以滿足快速變化的客戶需求。這些應(yīng)用采用自動化的,可擴展的,和高可用的架構(gòu)。這個工程團隊通過高效的云計算現(xiàn)網(wǎng)的運維來提供這一應(yīng)用服務(wù),并且根據(jù)線上反饋對服務(wù)進行不斷地改進。
2、云原生的組成
云原生 = 微服務(wù) + DevOps + 持續(xù)交付 + 容器化。
微服務(wù)是一種軟件開發(fā)技術(shù),它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶提供最終價值。微服務(wù)體系結(jié)構(gòu)有許多重要的好處。首先,它解決了業(yè)務(wù)復(fù)雜性的問題。它將原來龐大的單個應(yīng)用程序分解為一組服務(wù)。盡管功能的總數(shù)保持不變,但應(yīng)用程序已被分解為可管理的服務(wù)。單個服務(wù)的開發(fā)速度要快得多,而且更容易理解和維護。其次,這種架構(gòu)允許每個服務(wù)由一個團隊獨立開發(fā)。開發(fā)人員可以自由選擇任何適當?shù)募夹g(shù)。第三,微服務(wù)架構(gòu)模式允許各個服務(wù)獨立部署。開發(fā)人員永遠不需要協(xié)調(diào)對其服務(wù)的本地更改的部署。這些類型的更改可以在測試后立即部署。最后,微服務(wù)體系結(jié)構(gòu)允許每個服務(wù)獨立擴展。
DevOps的意思就是開發(fā)和運維不再是分開的兩個團隊,而是你中有我,我中有你的一個團隊。我們現(xiàn)在開發(fā)和運維已經(jīng)是一個團隊了,但是運維方面的知識和經(jīng)驗還需要持續(xù)提高。
持續(xù)交付的意思就是在不影響用戶使用服務(wù)的前提下頻繁把新功能發(fā)布給用戶使用,要做到這點非常非常難。我們現(xiàn)在兩周一個版本,每次上線之后都會給不同的用戶造成不同程度的影響。
容器化的好處在于運維的時候不需要再關(guān)心每個服務(wù)所使用的技術(shù)棧了,每個服務(wù)都被無差別地封裝在容器里,可以被無差別地管理和維護,現(xiàn)在比較流行的工具是docker和k8s。
3、云原生與k8s
k8s是云原生的重要組成部分, k8s由Node、Pod、Service、Volume、Label等組成。
Master
- 集群控制節(jié)點,每個集群需要至少一個master節(jié)點負責(zé)集群的管控;
Node
- 工作負載節(jié)點,由master分配容器到這些node工作節(jié)點上,然后node節(jié)點上的docker 負責(zé)容器的運行,運行真正的應(yīng)用程序,在Node上Kubernetes管理的最小運行單元是Pod。
- Node上運行著Kubernetes的Kubelet、kube-proxy服務(wù)進程,這些服務(wù)進程負責(zé)Pod的創(chuàng)建、啟動、監(jiān)控、重啟、銷毀、以及實現(xiàn)軟件模式的負載均衡。
Node包含的信息:
- Node地址:主機的IP地址,或Node ID。
- Node的運行狀態(tài):Pending、Running、Terminated三種狀態(tài)。
- Node系統(tǒng)容量(Node Condition):描述Node可用的系統(tǒng)資源,包括CPU、內(nèi)存、最大可調(diào)度Pod數(shù)量等。
- 其他:內(nèi)核版本號、Kubernetes版本等。
Pod
- Pod是Kubernetes最基本的操作單元,包含一個或多個緊密相關(guān)的容器,一個Pod可以被一個容器化的環(huán)境看作應(yīng)用層的“邏輯宿主機”;
- 一個Pod中的多個容器應(yīng)用通常是緊密耦合的,Pod在Node上被創(chuàng)建、啟動或者銷毀;每個Pod里運行著一個特殊的被稱之為Pause的容器,其他容器則為業(yè)務(wù)容器,這些業(yè)務(wù)容器共享Pause容器的網(wǎng)絡(luò)棧和Volume掛載卷,因此他們之間通信和數(shù)據(jù)交換更為高效,在設(shè)計時我們可以充分利用這一特性將一組密切相關(guān)的服務(wù)進程放入同一個Pod中。同一個Pod里的容器之間僅需通過localhost就能互相通信。
一個Pod中的應(yīng)用容器共享同一組資源:
- PID命名空間:Pod中的不同應(yīng)用程序可以看到其他應(yīng)用程序的進程ID;
- 網(wǎng)絡(luò)命名空間:Pod中的多個容器能夠訪問同一個IP和端口范圍;
- IPC命名空間:Pod中的多個容器能夠使用SystemV IPC或POSIX消息隊列進行通信;
- UTS命名空間:Pod中的多個容器共享一個主機名;
- Volumes(共享存儲卷):Pod中的各個容器可以訪問在Pod級別定義的Volumes;Pod的生命周期通過Replication Controller來管理;通過模板進行定義,然后分配到一個Node上運行,在Pod所包含容器運行結(jié)束后,Pod結(jié)束。
Controller
- 控制器,通過它來實現(xiàn)對pod的管理,比如啟動、停止、伸縮pod的數(shù)量。
Service
pod對外服務(wù)的統(tǒng)一入口,下面可以維護者同一類的多個pod。在Kubernetes的世界里,雖然每個Pod都會被分配一個單獨的IP地址,但這個IP地址會隨著Pod的銷毀而消失,這就引出一個問題:
- 如果有一組Pod組成一個集群來提供服務(wù),那么如何來訪問它呢?Service!一個Service可以看作一組提供相同服務(wù)的Pod的對外訪問接口,Service作用于哪些Pod是通過Label Selector來定義的。擁有一個指定的名字(比如my-mysql-server);
- 擁有一個虛擬IP(Cluster IP、Service IP或VIP)和端口號,銷毀之前不會改變,只能內(nèi)網(wǎng)訪問;
- 能夠提供某種遠程服務(wù)能力;被映射到了提供這種服務(wù)能力的一組容器應(yīng)用上;
- 如果Service要提供外網(wǎng)服務(wù),需指定公共IP和NodePort,或外部負載均衡器;
- NodePort 系統(tǒng)會在Kubernetes集群中的每個Node上打開一個主機的真實端口,這樣,能夠訪問Node的客戶端就能通過這個端口訪問到內(nèi)部的Service了
Label
- 標簽,用于對pod進行分類,同一類pod會擁有相同的標簽。
- Label以key/value的形式附加到各種對象上,如Pod、Service、RC、Node等,以識別這些對象,管理關(guān)聯(lián)關(guān)系等,如Service和Pod的關(guān)聯(lián)關(guān)系。
NameSpace
- 命名空間,用來隔離pod的運行環(huán)境。
二、k8s集群搭建
集群架構(gòu)圖
1、系統(tǒng)環(huán)境準備
三臺centos7虛擬機,主機名分別為master(192.168.2.8)、slave1(192.168.2.9)、 slave2(192.168.2.10),并安裝好docker環(huán)境, docker安裝成功后檢測如下:
安裝好docker后,進行如下設(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)
同步主機的時間
yum install ntpdate -y ntpdate -u time.windows.com
生成CA秘鑰、Certificates證書
在master節(jié)點安裝CFSSL工具用來建立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證書
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 證書
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個證書文件
將5個文件分發(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分布在集群中的每個節(jié)點,負責(zé)啟動pod容器,kubeadm用于初始化k8s集群, kubectl用于增刪查各種k8s的資源的工具類。
#cnetos安裝 yum install -y kubelet-1.23.15 kubeadm-1.23.15 kubectl-1.23.15 systemctl enable kubelet --now
注:如果kubelet無法正常啟動(journalctl -xeu kubelet 查看啟啟動日志),一般情況下檢查一下/etc/docker/daemon.json是否存在以下配置:
"exec-opts": [ "native.cgroupdriver=systemd" ],
修改后重啟docker: systemctl restart docker
部署Kubernetes Master
在 192.168.2.8(Master)執(zhí)行為了提高安裝成功率,安裝之前先做一次重置,指定阿里 云鏡像倉庫地址
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
集群主機節(jié)點初始化操作
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é)點初始化成功后,下載安裝 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)段與集群初始化時候的保持一直 - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16" kubectl apply –f calico.yaml
初始化工作節(jié)點
向集群添加新節(jié)點,執(zhí)行在 kubeadm init 輸出的 kubeadm join 命令(證書在master安裝
后會 直接顯示出來,直接拷貝過來)
kubeadm join 192.168.2.8:6443 --token 7s9vq1.4d5kp8yubatwjzgr --discovery-token-ca-cert-hash sha256:5b042272bbd8b8692581202ba7dba8e1721078facb40878485d40bde8b1d986e --ignore-preflight-errors=all
注:如果token過期可以使用以下方式創(chuàng)建查詢
#查看token kubeadm token list #創(chuàng)建token kubeadm token create --print-join-command
查看k8s集群
kubectl get nodes
如果節(jié)點的狀態(tài)為NotReady,查詢?nèi)罩具M行排查:
journalctl -f -u kubelet.service kubectl describe node nodename
驗證k8s集群環(huán)境
在 Kubernetes 集群中創(chuàng)建一個 pod,安裝nignx鏡像容器
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get pod,svc
注:可以通過下面的方式生成部署的yaml文件
kubectl create deployment nginx --image=nginx --dry-run -o yaml
查看nignx的端口
訪問nignx的默認頁面 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)建訪問賬戶、獲取訪問令牌
#創(chuàng)建sa賬戶 kubectl create sa kubepi-user --namespace kube-system #分配角色 kubectl create clusterrolebinding kubepi-user --clusterrole=cluster-admin --serviceaccount=kube-system:kubepi-user #查詢訪問令牌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}'
訪問dashboard管理頁面(http://master:7110/ ),默認賬密(admin/kubepi)
三、k8s常用命令
#開機自啟 systemctl enable kubelet #禁用自啟 systemctl disable kubelet #刪除從節(jié)點 kubelet delete node slave1 #創(chuàng)建命名空間 kubectl create namespace ns-test #查看節(jié)點 kubectl get nodes kubectl get node -A #查看執(zhí)行任務(wù) kubectl get job -n ns-test #查詢pods kubectl get pods -A kubectl get pods -n kube-ns-test -o wide #查詢部署情況 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名> #查詢持久卷 kubectl get pv -A #查詢持久卷聲明 kubectl get -n ns-test pvc #查詢存儲類型 kubectl get storageclass -A #副本擴容 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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于CentOS7日志文件及journalctl日志查看方法
這篇文章主要介紹了關(guān)于CentOS7日志文件及journalctl日志查看方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03kubernetes部署dashboard及應(yīng)用小結(jié)
Dashboard?是基于網(wǎng)頁的?Kubernetes?用戶界面,可以對?Deployment?實現(xiàn)彈性伸縮、發(fā)起滾動升級、重啟?Pod?或者使用向?qū)?chuàng)建新的應(yīng)用,這篇文章主要介紹了kubernetes部署dashboard,需要的朋友可以參考下2024-06-06K8S?實用工具之合并多個kubeconfig實現(xiàn)詳解
這篇文章主要為大家介紹了K8S?實用工具之合并多個kubeconfig實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03