Kubernetes 的基本架構(gòu),由Matser和Node子節(jié)點(diǎn)組成,使用kubectl進(jìn)行通信, Master 里的組件有哪些:
Master 里有 4 個(gè)組件,分別是 apiserver、etcd、scheduler、controller-manager。
【資料圖】
Kubernetes 的基本架構(gòu),由Matser和Node子節(jié)點(diǎn)組成,使用kubectl進(jìn)行通信, Master 里的組件有哪些:
Master 里有 4 個(gè)組件,分別是 apiserver、etcd、scheduler、controller-manager。
Api Server 系統(tǒng)唯一入口聯(lián)絡(luò)員,controller-manager監(jiān)控運(yùn)維節(jié)點(diǎn)容器狀態(tài),kube scheduler負(fù)責(zé)容器的編排,etcd負(fù)責(zé)持久化存儲(chǔ)和服務(wù)發(fā)現(xiàn)。
這 4 個(gè)組件也都被容器化了,運(yùn)行在集群的 Pod 里,我們可以用 kubectl 來查看它們的狀態(tài),使用命令:
kubectl get pod -n kube-system
我使用的電腦是Mac pro M2芯的,使用的虛擬環(huán)境是 Ubuntu 22.04 ,M2芯兼容性不是特別好,所以盡量跟我博客中的版本保持一致。
虛擬機(jī)環(huán)境 Ubuntu 22.04docker :20.10.17minikube:v1.25.2
安裝虛擬機(jī)需要的工具,ip addr 查看ip,可以使用終端登錄虛擬機(jī)。
sudo apt updatesudo apt install -y git vim curl jq openssh-server
下載時(shí)請(qǐng)注意版本,以宿主機(jī)的版本為準(zhǔn),下載對(duì)應(yīng)的版本,不然會(huì)報(bào)bash: /usr/local/bin/kubectl:無法執(zhí)行二進(jìn)制文件: 可執(zhí)行文件格式錯(cuò)誤
的錯(cuò)誤提示。
curl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v1.25.2/minikube-linux-arm64sudo install minikube /usr/local/bin/
使用minikube version
查看版本:
minikube version: v1.25.2commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7
使用minikube kubectl
命令來安裝kubectl
:
在這之前需要安裝docker,使用命令sudo snap install docker
,把當(dāng)前用戶加入到docker組,命令如下:
sudo docker version --format {{.Server.Os}}-{{.Server.Version}}sudo groupadd dockersudo usermod -aG docker $USER && newgrp docker
啟動(dòng):
minikube start --image-mirror-country="cn"--image-repository="registry.cn-hangzhou.aliyuncs.com/google_containers"
啟動(dòng)完成后可以使用這兩個(gè)命令查看集群狀態(tài):
minikube statusminikube node list
查看kubectl
版本,minikube kubectl -- version
使用 Linux 的“alias”功能,為它創(chuàng)建一個(gè)別名,寫到當(dāng)前用戶目錄下的 .bashrc 里,也就是這樣:
alias kubectl="minikube kubectl --"
虛擬機(jī)安裝完成后,重啟一下虛擬機(jī),不然會(huì)報(bào)Exiting due to DRV_NOT_HEALTHY:
意思是沒找到容器的驅(qū)動(dòng)器,有時(shí)間這個(gè)問題的原因是docker沒有啟動(dòng)。
執(zhí)行kubectl run ngx --image=nginx:alpine
,這里涉及 Kubernetes 里的一個(gè)非常重要的概念:Pod。
命令執(zhí)行之后kubectl get pod
可以看到,在 Kubernetes 集群里就有了一個(gè)名字叫 ngx 的 Pod 正在運(yùn)行,表示我們的這個(gè)單節(jié)點(diǎn) minikube 環(huán)境已經(jīng)搭建成功。
查看插件的命令minikube addons list
比較重要的有兩個(gè):DNS 和 Dashboard。
在 minikube 環(huán)境里執(zhí)行一條簡(jiǎn)單的命令,就可以自動(dòng)用瀏覽器打開 Dashboard 頁面,而且還支持中文 minikube dashboard
如果想設(shè)置外網(wǎng)可以訪問,執(zhí)行命令kubectl proxy --port=8001 --address="192.168.88.131" --accept-hosts="^.*" &
編寫yaml文檔有兩個(gè)小技巧,一個(gè)是參考Kubernetes 的官方參考文檔,https://kubernetes.io/docs/reference/kubernetes-api/。
第二個(gè)是使用kubectl命令:
kubectl explain podkubectl explain pod.metadatakubectl explain pod.speckubectl explain pod.spec.containers
使用kubectl例如寫入一個(gè)模版,輸出到一個(gè)指定文件中:
kubectl run ngx --image=nginx:alpine --dry-run=client -o yaml > nginx_pod.yaml
pod的關(guān)鍵在于yaml文件的編寫,然后用kubectl去執(zhí)行:
# 添加podkubectl apply -f nginx_pod.yaml# 刪除podkubectl delete pod [podname]# 查看pod節(jié)點(diǎn)kubectl get pod -o wide# 查看日志kubectl logs [podname]# 查看pod詳細(xì)情況kubectl describe pod [podname]# 登陸pod kubectl exec -it ngx-pod -- bash
先從搭建一個(gè)簡(jiǎn)單的WordPress網(wǎng)站開始,在這之前你先了解一下yaml語言,因?yàn)閗8s需要的通信都是建立在yaml語言之上,和web中的html一樣,是所有運(yùn)行的基礎(chǔ)。
先看看下圖,這是我們要完成的事情,也是k8s的原理所在,宿主機(jī)上搭建Nginx 做反向代理,相當(dāng)于做了一次網(wǎng)關(guān),K8s映射的端口,已達(dá)成通信的目的。
1:部署MariaDB,準(zhǔn)備yml文件 maria.yml
apiVersion: v1kind: ConfigMapmetadata: name: maria-cmdata: DATABASE: "db" USER: "wp" PASSWORD: "123" ROOT_PASSWORD: "123"---apiVersion: v1kind: Podmetadata: name: maria-pod labels: app: wordpress role: databasespec: containers: - image: mariadb:10 name: maria imagePullPolicy: IfNotPresent ports: - containerPort: 3306 envFrom: - prefix: "MARIADB_" configMapRef: name: maria-cm
執(zhí)行命令kubectl apply -y maria.yml
2.部署WordPress的Pod
執(zhí)行kubectl get pod -o wide
命令,查看maria-pod的IP地址和運(yùn)行狀態(tài),我本地的是172.17.0.6,狀態(tài)是Running,表示ok。
node3@node3-virtual-machine:~/yaml$ kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmaria-pod 1/1 Running 0 96m 172.17.0.6 minikube
準(zhǔn)備yml文件 wordpress-pod.yml
apiVersion: v1kind: ConfigMapmetadata: name: wp-cmdata: HOST: "172.17.0.6" USER: "wp" PASSWORD: "123" NAME: "db"---apiVersion: v1kind: Podmetadata: name: wp-pod labels: app: wordpress role: websitespec: containers: - image: wordpress:5 name: wp-pod imagePullPolicy: IfNotPresent ports: - containerPort: 80 envFrom: - prefix: "WORDPRESS_DB_" configMapRef: name: wp-cm
執(zhí)行部署命令,kubectl apply -f wordpress-pod.yml
3.WordPress Pod 映射端口號(hào),讓它在集群外可見
因?yàn)?Pod 都是運(yùn)行在 Kubernetes 內(nèi)部的私有網(wǎng)段里的,外界無法直接訪問,想要對(duì)外暴露服務(wù),需要使用一個(gè)專門的 kubectl port-forward 命令,它專門負(fù)責(zé)把本機(jī)的端口映射到在目標(biāo)對(duì)象的端口號(hào),經(jīng)常用于 Kubernetes 的臨時(shí)調(diào)試和測(cè)試。
kubectl port-forward wp-pod 8080:80 &
如果想關(guān)閉端口轉(zhuǎn)發(fā),需要敲命令 fg ,它會(huì)把后臺(tái)的任務(wù)帶回到前臺(tái),然后就可以簡(jiǎn)單地用“Ctrl + C”來停止轉(zhuǎn)發(fā)了。
4.創(chuàng)建反向代理的 Nginx
nginx的配置文件,準(zhǔn)備proxy.conf,我本地的路徑/home/node3/conf/proxy.conf
server { listen 80; default_type text/html; location / { proxy_http_version 1.1; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080; }}
執(zhí)行docker命令,我本機(jī)虛擬機(jī)的ip是192.168.88.131 :
docker run -d --rm \ --net=host \ -v /home/node3/conf/proxy.conf:/etc/nginx/conf.d/default.conf \ nginx:alpine
免責(zé)聲明:本文不構(gòu)成任何商業(yè)建議,投資有風(fēng)險(xiǎn),選擇需謹(jǐn)慎!本站發(fā)布的圖文一切為分享交流,傳播正能量,此文不保證數(shù)據(jù)的準(zhǔn)確性,內(nèi)容僅供參考
關(guān)鍵詞: