Kubernetes 部署應(yīng)用(Nginx)的兩種方式,你更喜歡哪一種?
k8s發(fā)布應(yīng)用的兩種方式:
- kubernetes-dashboard
- kubectl命令行
一、Dashboard方式
配置部署:包含應(yīng)用名稱(chēng)、容器鎰、pod數(shù)量、Service非常的方便,不想設(shè)置配置yaml的可以很方便的部署。
點(diǎn)擊部署就成功了k8s應(yīng)用的部署了。部署后可以看到相應(yīng)的deployment、pod、service等狀態(tài)和信息。
- Deployment
- Pod
- Service
- 監(jiān)控
二、命令行方式
1、創(chuàng)建namespace
vim nginx-namespace.yaml
apiVersion: v1 #類(lèi)型為Namespace
kind: Namespace #類(lèi)型為Namespace
metadata:
name: ns-test #命名空間名稱(chēng)
labels:
name: label-test #pod標(biāo)簽
執(zhí)行:
#創(chuàng)建
kubectl create -f nginx-namespace.yaml
#查詢(xún)
kubectl get namespace
2、創(chuàng)建pod
一般不直接create pod,而是通過(guò)controller來(lái)創(chuàng)建pod。deployment為其中一種controller。
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: ns-test
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
執(zhí)行:
#創(chuàng)建
kubectl create -f nginx-deployment.yaml
#查詢(xún)。查詢(xún)時(shí)需要等待一會(huì),此時(shí)會(huì)下載鏡像需要時(shí)間
kubectl get deployment -n ns-test
#或
kubectl get pods -n ns-test
可以看到"replicas: 3",所以有3個(gè)pod并且每個(gè)pod只有一個(gè)容器。都正常啟動(dòng)。
接下來(lái)看看如何訪問(wèn),查看訪問(wèn)的端口:
kubectl get pods -o wide -n ns-test #-o wide 展開(kāi)的意思
這時(shí)已經(jīng)可以訪問(wèn)了,就是通過(guò)虛擬ip來(lái)端口。
- curl 10.244.1.43
- curl 10.244.1.44
- curl 10.244.1.45
如下圖,只要集群范圍內(nèi)的機(jī)器就可以直接通過(guò)IP訪問(wèn)了。
那問(wèn)題來(lái)了,這么多虛擬ip,每次pod重建還會(huì)重新生成,那怎么辦呢?
看下面的servcie。
3、創(chuàng)建service
vim nginx-service.yaml:
apiVersion: v1
kind: Service
metadata:
namespace: ns-test
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
執(zhí)行:
kubectl apply -f nginx-service.yaml
kubectl get svc nginx-service -o wide -n ns-test
可以看到有一個(gè)cluster-ip,通過(guò)這個(gè)端口+端口就可以負(fù)載到之前3個(gè)節(jié)點(diǎn)的nginx了。
當(dāng)然cluster-ip也只能在集群內(nèi)的機(jī)器訪問(wèn)。再結(jié)合nginx或域名就可以向外提供負(fù)載均衡訪問(wèn)了。
可以看到cluster-ip雖然有負(fù)載均衡的功能但還是不能外網(wǎng)訪問(wèn)k8s部署的應(yīng)用,那如何才能直接外網(wǎng)能訪問(wèn)k8s部署的應(yīng)用呢?
設(shè)置service為nodeport方式,如下:
apiVersion: v1
kind: Service
metadata:
namespace: ns-test
name: nginx-service
spec:
selector:
app: nginx
ports:
- nodePort: 30000
protocol: TCP
port: 80
targetPort: 80
type: NodePort
其中type: NodePort另外想指定端口也可以加上nodePort: 30000。這樣就可以通過(guò)主機(jī)ip+nodePort的訪問(wèn)k8s部署的應(yīng)用了。
執(zhí)行:
kubectl apply -f nginx-service.yaml
kubectl get svc nginx-service -o wide -n ns-test
可以看到我使用的是我主機(jī)的ip+nodePort可以直接訪問(wèn)到nginx了。
三、補(bǔ)充知識(shí)
1、Service
Kubernetes 服務(wù)有四種類(lèi)型:ClusterIP、NodePort、LoadBalancer 和ExternalName。服務(wù)spec中的type 屬性決定了服務(wù)如何暴露給網(wǎng)絡(luò)。
- ClusterIP 類(lèi)型的服務(wù)將在集群內(nèi)部暴露,并分配一個(gè) cluster IP 地址。Pod 可以通過(guò)這個(gè) IP 地址來(lái)訪問(wèn)該服務(wù)。ClusterIP 類(lèi)型的服務(wù)適用于需要在集群內(nèi)部訪問(wèn)的服務(wù),例如數(shù)據(jù)庫(kù)服務(wù)。
- NodePort 類(lèi)型的服務(wù)將在每個(gè)節(jié)點(diǎn)上暴露一個(gè)端口,并分配一個(gè) cluster IP 地址。外部客戶(hù)端可以通過(guò) <NodeIP>:<NodePort> 來(lái)訪問(wèn)該服務(wù)。NodePort 類(lèi)型的服務(wù)適用于需要在集群外部訪問(wèn)的服務(wù),例如 Web 服務(wù)。
- LoadBalancer 類(lèi)型的服務(wù)將使用集群外部的負(fù)載均衡器來(lái)暴露服務(wù)。外部客戶(hù)端可以通過(guò)負(fù)載均衡器的 IP 地址來(lái)訪問(wèn)該服務(wù)。LoadBalancer 類(lèi)型的服務(wù)適用于需要在集群外部訪問(wèn)的服務(wù),并且需要高可用性的服務(wù)。一般LoadBalancer是付費(fèi)提供的。
- ExternalName 類(lèi)型的服務(wù)將將服務(wù)指向一個(gè)外部主機(jī)或域名。Pod 可以通過(guò)該主機(jī)或域名來(lái)訪問(wèn)該服務(wù)。ExternalName 類(lèi)型的服務(wù)適用于需要訪問(wèn)外部服務(wù)的場(chǎng)景。