云原生與k8s集群構(gòu)建全過程
一、云原生和kubernetes
1、云原生的概念
云是和本地相對的,傳統(tǒng)的應用必須跑在本地服務器上,現(xiàn)在流行的應用都跑在云端,云包含了IaaS、PaaS和SaaS。原生就是土生土長的意思,我們在開始設計應用的時候就考慮到應用將來是運行云環(huán)境里面的,要充分利用云資源的優(yōu)點,比如?云服務的彈性和分布式優(yōu)勢。
云原生是基于分布部署和統(tǒng)一運管的云端服務,以容器、微服務、DevOps等技術(shù)為基礎建立的一套云技術(shù)產(chǎn)品體系。云原生指的是一個靈活的工程團隊,遵循敏捷的研發(fā)原則,使用高度自動化的研發(fā)工具,開發(fā)專門基于并部署在云基礎設施上的應用,以滿足快速變化的客戶需求。這些應用采用自動化的,可擴展的,和高可用的架構(gòu)。這個工程團隊通過高效的云計算現(xiàn)網(wǎng)的運維來提供這一應用服務,并且根據(jù)線上反饋對服務進行不斷地改進。
2、云原生的組成
云原生 = 微服務 + DevOps + 持續(xù)交付 + 容器化。
微服務是一種軟件開發(fā)技術(shù),它提倡將單一應用程序劃分成一組小的服務,服務之間互相協(xié)調(diào)、互相配合,為用戶提供最終價值。微服務體系結(jié)構(gòu)有許多重要的好處。首先,它解決了業(yè)務復雜性的問題。它將原來龐大的單個應用程序分解為一組服務。盡管功能的總數(shù)保持不變,但應用程序已被分解為可管理的服務。單個服務的開發(fā)速度要快得多,而且更容易理解和維護。其次,這種架構(gòu)允許每個服務由一個團隊獨立開發(fā)。開發(fā)人員可以自由選擇任何適當?shù)募夹g(shù)。第三,微服務架構(gòu)模式允許各個服務獨立部署。開發(fā)人員永遠不需要協(xié)調(diào)對其服務的本地更改的部署。這些類型的更改可以在測試后立即部署。最后,微服務體系結(jié)構(gòu)允許每個服務獨立擴展。
DevOps的意思就是開發(fā)和運維不再是分開的兩個團隊,而是你中有我,我中有你的一個團隊。我們現(xiàn)在開發(fā)和運維已經(jīng)是一個團隊了,但是運維方面的知識和經(jīng)驗還需要持續(xù)提高。
持續(xù)交付的意思就是在不影響用戶使用服務的前提下頻繁把新功能發(fā)布給用戶使用,要做到這點非常非常難。我們現(xiàn)在兩周一個版本,每次上線之后都會給不同的用戶造成不同程度的影響。
容器化的好處在于運維的時候不需要再關心每個服務所使用的技術(shù)棧了,每個服務都被無差別地封裝在容器里,可以被無差別地管理和維護,現(xiàn)在比較流行的工具是docker和k8s。

3、云原生與k8s
k8s是云原生的重要組成部分, k8s由Node、Pod、Service、Volume、Label等組成。
Master
- 集群控制節(jié)點,每個集群需要至少一個master節(jié)點負責集群的管控;
Node
- 工作負載節(jié)點,由master分配容器到這些node工作節(jié)點上,然后node節(jié)點上的docker 負責容器的運行,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。
- Node上運行著Kubernetes的Kubelet、kube-proxy服務進程,這些服務進程負責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最基本的操作單元,包含一個或多個緊密相關的容器,一個Pod可以被一個容器化的環(huán)境看作應用層的“邏輯宿主機”;
- 一個Pod中的多個容器應用通常是緊密耦合的,Pod在Node上被創(chuàng)建、啟動或者銷毀;每個Pod里運行著一個特殊的被稱之為Pause的容器,其他容器則為業(yè)務容器,這些業(yè)務容器共享Pause容器的網(wǎng)絡棧和Volume掛載卷,因此他們之間通信和數(shù)據(jù)交換更為高效,在設計時我們可以充分利用這一特性將一組密切相關的服務進程放入同一個Pod中。同一個Pod里的容器之間僅需通過localhost就能互相通信。
一個Pod中的應用容器共享同一組資源:
- PID命名空間:Pod中的不同應用程序可以看到其他應用程序的進程ID;
- 網(wǎng)絡命名空間: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對外服務的統(tǒng)一入口,下面可以維護者同一類的多個pod。在Kubernetes的世界里,雖然每個Pod都會被分配一個單獨的IP地址,但這個IP地址會隨著Pod的銷毀而消失,這就引出一個問題:
- 如果有一組Pod組成一個集群來提供服務,那么如何來訪問它呢?Service!一個Service可以看作一組提供相同服務的Pod的對外訪問接口,Service作用于哪些Pod是通過Label Selector來定義的。擁有一個指定的名字(比如my-mysql-server);
- 擁有一個虛擬IP(Cluster IP、Service IP或VIP)和端口號,銷毀之前不會改變,只能內(nèi)網(wǎng)訪問;
- 能夠提供某種遠程服務能力;被映射到了提供這種服務能力的一組容器應用上;
- 如果Service要提供外網(wǎng)服務,需指定公共IP和NodePort,或外部負載均衡器;
- NodePort 系統(tǒng)會在Kubernetes集群中的每個Node上打開一個主機的真實端口,這樣,能夠訪問Node的客戶端就能通過這個端口訪問到內(nèi)部的Service了
Label
- 標簽,用于對pod進行分類,同一類pod會擁有相同的標簽。
- Label以key/value的形式附加到各種對象上,如Pod、Service、RC、Node等,以識別這些對象,管理關聯(lián)關系等,如Service和Pod的關聯(liá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后,進行如下設置
關閉 防火墻 、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相應的目錄上
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é)點,負責啟動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)絡插件(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)絡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í)行任務 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 #查看服務信息 kubectl get svc -A #查看服務日志 kubectl logs -f -n ns-test <pod名> #服務交互 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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
關于CentOS7日志文件及journalctl日志查看方法
這篇文章主要介紹了關于CentOS7日志文件及journalctl日志查看方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
kubernetes部署dashboard及應用小結(jié)
Dashboard?是基于網(wǎng)頁的?Kubernetes?用戶界面,可以對?Deployment?實現(xiàn)彈性伸縮、發(fā)起滾動升級、重啟?Pod?或者使用向?qū)?chuàng)建新的應用,這篇文章主要介紹了kubernetes部署dashboard,需要的朋友可以參考下2024-06-06
K8S?實用工具之合并多個kubeconfig實現(xiàn)詳解
這篇文章主要為大家介紹了K8S?實用工具之合并多個kubeconfig實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03

