[root@icv-k8s-node-1 ~]# kubectl create deployment javaedge-nginx --image=nginx:1.24.0
deployment.apps/javaedge-nginx created
[root@icv-k8s-node-1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/javaedge-nginx-6996b98cc4-f28r2 1/1 Running 0 29s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/javaedge-nginx 1/1 1 1 29s
NAME DESIRED CURRENT READY AGE
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 29s
[root@icv-k8s-node-1 ~]# kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/javaedge-nginx-6996b98cc4-f28r2 1/1 Running 0 15m 10.244.26.65 icv-k8s-node-2 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/javaedge-nginx 1/1 1 1 15m nginx nginx:1.24.0 app=javaedge-nginx
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 15m nginx nginx:1.24.0 app=javaedge-nginx,pod-template-hash=6996b98cc4
[root@icv-k8s-node-1 ~]#
可見,這個(gè) nginx 并沒有創(chuàng)建在 master 節(jié)點(diǎn), 而是 slave 節(jié)點(diǎn)去了。
1 端口暴露
pod的8088端口作為容器的8080端口進(jìn)行映射,pod要對(duì)外提供訪問,需要實(shí)現(xiàn)service服務(wù),有了
service才能被訪問??梢哉J(rèn)為service是管理一組pod的。 NodePort:把服務(wù)對(duì)外暴露公開
[root@icv-k8s-node-1 ~]# kubectl expose deployment javaedge-nginx --port=90 --target-port=80 --type=NodePort
service/javaedge-nginx exposed
[root@icv-k8s-node-1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/javaedge-nginx-6996b98cc4-f28r2 1/1 Running 0 29m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/javaedge-nginx NodePort 10.99.205.238 <none> 90:32708/TCP 3m48s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/javaedge-nginx 1/1 1 1 29m
NAME DESIRED CURRENT READY AGE
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 29m
[root@icv-k8s-node-1 ~]#
-
90:32708/TCP
中的90
是 Service 的端口 -
32708
是 NodePort 的端口,表示該 Service 被映射到了 Node 上的32708
端口
因此,對(duì)外暴露的端口是 32708
,而不是 90
。在 k8s 集群中,可通過 <NodeIP>:<NodePort>
訪問該 Service。
添加了一個(gè)新的 Node
組件,表示 Kubernetes 集群中的一個(gè) Node。該 Node
上運(yùn)行著 Service
的 NodePort
端口(即 NodePort: 32708
)。Service
的 NodePort
端口將被映射到 Node 上的該端口。因此,外部客戶端可以通過 <NodeIP>:<NodePort>
的方式訪問該 Service,并且 <NodeIP>
是該 Node 的 IP 地址,<NodePort>
是 NodePort: 32708
。
瀏覽器訪問:
把其中一個(gè)node關(guān)機(jī)。 查看node狀態(tài),剛才關(guān)機(jī)的node已經(jīng)是 not ready 了。但再次查看pod還有 nginx pod,這就實(shí)現(xiàn)中間件的容災(zāi)問題,一旦出現(xiàn)宕機(jī),則可以恢復(fù)重啟。
刪除 service:
kubectl delete service/javaedge-nginx
刪除 deployment:
kubectl delete deployment/deployment_name
2 動(dòng)態(tài)擴(kuò)縮容(彈性伸縮)
擴(kuò)容
[root@icv-k8s-node-1 ~]# kubectl get allNAME READY STATUS RESTARTS AGE
pod/javaedge-nginx-6996b98cc4-gncwc 1/1 Running 0 13m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/javaedge-nginx 1/1 1 1 3h37m
NAME DESIRED CURRENT READY AGE
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 3h37m
[root@icv-k8s-node-1 ~]# kubectl scale --replicas=2 deployment javaedge-nginx
deployment.apps/javaedge-nginx scaled
[root@icv-k8s-node-1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/javaedge-nginx-6996b98cc4-gncwc 1/1 Running 0 13m
pod/javaedge-nginx-6996b98cc4-n4qkk 1/1 Running 0 8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/javaedge-nginx 2/2 2 2 3h37m
NAME DESIRED CURRENT READY AGE
replicaset.apps/javaedge-nginx-6996b98cc4 2 2 2 3h37m
[root@icv-k8s-node-1 ~]#
當(dāng)突然高并發(fā)時(shí),就能臨時(shí)擴(kuò)容。
現(xiàn)在流量平穩(wěn)了,咱們
縮容
[root@icv-k8s-node-1 ~]# kubectl scale --replicas=1 deployment javaedge-nginx
deployment.apps/javaedge-nginx scaled
[root@icv-k8s-node-1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/javaedge-nginx-6996b98cc4-gncwc 1/1 Running 0 16m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/javaedge-nginx 1/1 1 1 3h40m
NAME DESIRED CURRENT READY AGE
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 3h40m
[root@icv-k8s-node-1 ~]#
可見 pod/javaedge-nginx-6996b98cc4-n4qkk被干掉了
刪除容器
kubectl get all
[root@icv-k8s-node-1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/javaedge-nginx-6996b98cc4-gncwc 1/1 Running 0 21m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/javaedge-nginx 1/1 1 1 3h45m
NAME DESIRED CURRENT READY AGE
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 3h45m
## 刪除部署信息,pod也會(huì)隨之刪除
[root@icv-k8s-node-1 ~]# kubectl delete deployment.apps/javaedge-nginx
deployment.apps "javaedge-nginx" deleted
[root@icv-k8s-node-1 ~]# kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
[root@icv-k8s-node-1 ~]#
## 刪除service信息
kubectl delete service/javaedge-nginx
3 負(fù)載均衡
之前設(shè)置那個(gè)是節(jié)點(diǎn)類型,現(xiàn)在使用集群類型,可以實(shí)現(xiàn)負(fù)載均衡 port: 集群端口 target-port: 內(nèi)部nginx
默認(rèn)端口 ClusterIP: 集群方式,k8s會(huì)自動(dòng)分配一個(gè)集群ip。
新建deployment
[root@icv-k8s-node-1 ~]# kubectl create deployment edge-nginx --image=nginx:1.24.0
deployment.apps/edge-nginx created
[root@icv-k8s-node-1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/edge-nginx-6d57745bc8-pgmdk 1/1 Running 0 37s
pod/javaedge-nginx-6996b98cc4-m84s5 1/1 Running 0 7m49s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/javaedge-nginx NodePort 10.109.194.31 <none> 90:31104/TCP 6m50s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/edge-nginx 1/1 1 1 37s
deployment.apps/javaedge-nginx 1/1 1 1 7m49s
NAME DESIRED CURRENT READY AGE
replicaset.apps/edge-nginx-6d57745bc8 1 1 1 37s
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 7m49s
[root@icv-k8s-node-1 ~]#
端口暴露
[root@icv-k8s-node-1 ~]# kubectl expose deployment edge-nginx --port=88 --target-port=80 --type=ClusterIP
service/edge-nginx exposed
[root@icv-k8s-node-1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/edge-nginx-6d57745bc8-pgmdk 1/1 Running 0 77s
pod/javaedge-nginx-6996b98cc4-m84s5 1/1 Running 0 8m29s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/edge-nginx ClusterIP 10.106.187.202 <none> 88/TCP 13s
service/javaedge-nginx NodePort 10.109.194.31 <none> 90:31104/TCP 7m30s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/edge-nginx 1/1 1 1 77s
deployment.apps/javaedge-nginx 1/1 1 1 8m29s
NAME DESIRED CURRENT READY AGE
replicaset.apps/edge-nginx-6d57745bc8 1 1 1 77s
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 8m29s
[root@icv-k8s-node-1 ~]#
所以啊,不能隨便命名。
擴(kuò)容
[root@icv-k8s-node-1 ~]# kubectl scale --replicas=3 deployment edge-nginx
deployment.apps/edge-nginx scaled
[root@icv-k8s-node-1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/edge-nginx-6d57745bc8-dm998 1/1 Running 0 9s
pod/edge-nginx-6d57745bc8-pgmdk 1/1 Running 0 3m57s
pod/edge-nginx-6d57745bc8-zsw9v 1/1 Running 0 9s
pod/javaedge-nginx-6996b98cc4-m84s5 1/1 Running 0 11m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/edge-nginx ClusterIP 10.106.187.202 <none> 88/TCP 2m53s
service/javaedge-nginx NodePort 10.109.194.31 <none> 90:31104/TCP 10m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/edge-nginx 3/3 3 3 3m57s
deployment.apps/javaedge-nginx 1/1 1 1 11m
NAME DESIRED CURRENT READY AGE
replicaset.apps/edge-nginx-6d57745bc8 3 3 3 3m57s
replicaset.apps/javaedge-nginx-6996b98cc4 1 1 1 11m
[root@icv-k8s-node-1 ~]# curl http://10.106.187.202:88/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@icv-k8s-node-1 ~]#
nginx返回都一樣的,如何測(cè)試實(shí)現(xiàn)了負(fù)載均衡呢?我們來通過 k8s(而不是 docker 的docker exec -it了)進(jìn)入容器內(nèi)部,而 pod 才是 k8s 最小單位,所以進(jìn)入 pod 的 name 即可:
[root@icv-k8s-node-1 ~]# kubectl exec -it edge-nginx-6d57745bc8-dm998 -- /bin/bash
root@edge-nginx-6d57745bc8-pgmdk:/# cd /usr/share/nginx/html
root@edge-nginx-6d57745bc8-dm998:/usr/share/nginx/html# apt-get update
root@edge-nginx-6d57745bc8-dm998:/usr/share/nginx/html# apt-get install
root@edge-nginx-6d57745bc8-zsw9v:/usr/share/nginx/html# vim index.html
ctrl+d退出當(dāng)前 pod,再對(duì)其他兩個(gè)副本同樣操作即可。
重新訪問集群 ip:
curl http://10.106.187.202:88/
你就會(huì)發(fā)現(xiàn)打印了不同的 JavaEdge 00x。
注:如果動(dòng)態(tài)擴(kuò)容,新的nginx節(jié)點(diǎn)會(huì)自動(dòng)加入pod,進(jìn)入負(fù)載均衡的效果
4 yml描述文件
前面我們部署操作nginx容器的時(shí)候,都是通過敲命令的方式進(jìn)行的,其實(shí)很繁瑣,一不小心就會(huì)失敗。
我們可以通過yaml配置文件來實(shí)現(xiàn)容器的部署,不需要再寫命令行了。yaml其實(shí)就是對(duì)象描述文件,我
們把要實(shí)現(xiàn)的容器作為一個(gè)對(duì)象去聲明,指定他的相關(guān)屬性即可。
比如可將:
- 部署deployment作為yaml
- 構(gòu)建pod作為yaml
- 實(shí)現(xiàn)負(fù)載均衡作為yaml
- 構(gòu)建service作為yaml
- ……都可以
通過運(yùn)行: kubectl apply -f xxx.yaml 可以實(shí)現(xiàn)文件中的內(nèi)容。
apiVersion: apps/v1 ## 同k8s集群版本?致,通過kubectl api-versions查看
kind: Deployment ## 本配置?件的類型
metadata: ## 元數(shù)據(jù),配置的?些基本屬性和信息
name: nginx-deployment ## 當(dāng)前 Deployment 的命名
labels: ## 標(biāo)簽,定義?個(gè)或多個(gè)資源,類似于 docker t
app: nginx ## 設(shè)置key為app,value為nginx的標(biāo)簽
spec: ## 當(dāng)前 Deployment 的具體描述,在k8s中的配置
replicas: 2 ## 指定將要部署的應(yīng)?副本數(shù)
selector: ## 標(biāo)簽選擇器,同上labels
matchLabels: ## 匹配并選擇包含標(biāo)簽app:nginx的相關(guān)資源
app: nginx
template: ## 使?Pod模板
metadata: ## Pod元數(shù)據(jù)
labels: ## Pod標(biāo)簽選擇,選擇包含[app:nginx]標(biāo)簽的Po
app: nginx
spec: ## 定義Pod中的容器詳細(xì)描述
containers: ## 同docker中的容器
- name: my-nginx ## 容器名稱
image: nginx:1.24.0 ## 容器所使用的鏡像名稱及版本號(hào)
[root@icv-k8s-node-1 home]# vim ngx-k8s_deployment.yaml
[root@icv-k8s-node-1 home]# kubectl apply -f ngx-k8s_deployment.yaml
deployment.apps/nginx-deployment created
[root@icv-k8s-node-1 home]#
現(xiàn)在想
4.1 縮容到一個(gè)咋辦?
修改 yaml
副本數(shù)改成 1 即可:
apply
[root@icv-k8s-node-1 home]# kubectl apply -f ngx-k8s_deployment.yaml
deployment.apps/nginx-deployment configured
[root@icv-k8s-node-1 home]#
現(xiàn)在 pod 數(shù)和副本數(shù)都變成 1 了:
[root@icv-k8s-node-1 home]# kubectl expose deployment nginx-deployment --port=88 --target-port=80 --type=NodePort --dry-run -o yaml
W0630 15:27:30.699552 3888 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx-deployment
spec:
ports:
- port: 88
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
status:
loadBalancer: {}
[root@icv-k8s-node-1 home]#
對(duì)此,新建一個(gè) yaml:
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx-deployment
spec:
ports:
- port: 89
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
status:
loadBalancer: {}
[root@icv-k8s-node-1 home]# kubectl apply -f k8s_ngx_expose.yaml
service/nginx-deployment created
[root@icv-k8s-node-1 home]#
根據(jù)該端口訪問也沒問題:
根據(jù)已有 pod 生成對(duì)應(yīng) yaml
[root@icv-k8s-node-1 home]# kubectl get pod edge-nginx-6d57745bc8-dm998 -o yaml > k8s_ngx_pod.yaml
[root@icv-k8s-node-1 home]# vim k8s_ngx_pod.yaml
[root@icv-k8s-node-1 home]#
如果想先創(chuàng)建 deployment,再創(chuàng)建 service,也可寫在一個(gè) yaml 文件里,只要兩部分中間用“—”分割即可:文章來源:http://www.zghlxwxcb.cn/news/detail-602983.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-602983.html
到了這里,關(guān)于從零開始:使用 Kubernetes 部署 Nginx 應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!