自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

圖解Kubernetes應(yīng)用部署

開(kāi)發(fā) 前端
在一切皆容器的時(shí)代,Kubernetes無(wú)疑是一個(gè)時(shí)代寵兒。越來(lái)越多的企業(yè)和個(gè)人開(kāi)始使用Kubernetes來(lái)虛擬化自己的業(yè)務(wù),管理自己的容器。那么如何在Kubernetes部署應(yīng)用,以及對(duì)運(yùn)行中的集群出現(xiàn)故障如何排查就成了大家日益關(guān)注的問(wèn)題了。

 在一切皆容器的時(shí)代,Kubernetes無(wú)疑是一個(gè)時(shí)代寵兒。越來(lái)越多的企業(yè)和個(gè)人開(kāi)始使用Kubernetes來(lái)虛擬化自己的業(yè)務(wù),管理自己的容器。那么如何在Kubernetes部署應(yīng)用,以及對(duì)運(yùn)行中的集群出現(xiàn)故障如何排查就成了大家日益關(guān)注的問(wèn)題了。本文蟲(chóng)蟲(chóng)給大家以直觀圖示方式介紹如何在Kubernetes中部署一個(gè)應(yīng)用以及如何排查Kubernetes的故障(下一篇,請(qǐng)等待)。

 

[[284919]]

 

概述

當(dāng)希望在Kubernetes中部署應(yīng)用程序時(shí),通常要定義三個(gè)組件:

  • 部署(Deployment):這是創(chuàng)建Pod應(yīng)用程序副本的方法
  • 服務(wù)(Service):將流量調(diào)度到Pods的內(nèi)部負(fù)載平衡器
  • 入口(Ingress):描述流量如何從群集外部流到服務(wù)。

直觀圖示

首先,在Kubernetes中,應(yīng)用程序應(yīng)該通過(guò)兩層負(fù)載均衡對(duì)外公開(kāi):內(nèi)部負(fù)載均衡器和外部負(fù)載均衡器。

 

圖解Kubernetes應(yīng)用部署

 

其次,內(nèi)部的負(fù)載均衡器又被稱為服務(wù),而外部的負(fù)載均衡器稱為入口。

 

圖解Kubernetes應(yīng)用部署

 

最后:Pods不會(huì)直接部署。相反,Deployment會(huì)在其上創(chuàng)建Pods和觀察者。

 

圖解Kubernetes應(yīng)用部署

 

應(yīng)用YAML示例

一個(gè)簡(jiǎn)單的Hello World應(yīng)用程序?yàn)槔?,該?yīng)用程序的YAML如下所示:

apiVersion: apps/v1

kind: Deployment

metadata:

name: my-deployment

labels:

track: canary

spec:

selector:

matchLabels:

any-name: my-app

template:

metadata:

labels:

any-name: my-app

spec:

containers:

- name: cont1

image: learnk8s/app:1.0.0

ports:

- containerPort: 8080

---

apiVersion: v1

kind: Service

metadata:

name: my-service

spec:

ports:

- port: 80

targetPort: 8080

selector:

name: app

---

apiVersion: networking.k8s.io/v1beta1

kind: Ingress

metadata:

name: my-ingress

spec:

rules:

- http:

paths:

- backend:

serviceName: app

servicePort: 80

path: /

該定義很長(zhǎng),不好發(fā)現(xiàn)組件之間的相互聯(lián)系。

比如下這些問(wèn)題:

什么時(shí)候應(yīng)該使用端口80,什么時(shí)候應(yīng)該使用端口8080?

為了避免沖突,是否應(yīng)要為每個(gè)服務(wù)都創(chuàng)建一個(gè)新端口?

標(biāo)簽名稱重要嗎?各處命名是否都應(yīng)該一致?

要回答這些問(wèn)題,請(qǐng)接著往下看:

連接部署和服務(wù)

實(shí)際上服務(wù)和部署沒(méi)有直接連接,服務(wù)跳過(guò)部署直接指向Pod。因此,要注意的實(shí)際上是Pod和服務(wù)之間的相互關(guān)系。

關(guān)鍵點(diǎn)

他們關(guān)系中要注意:

服務(wù)選擇器應(yīng)至少與Pod的一個(gè)標(biāo)簽匹配;

服務(wù)的目標(biāo)端口(targetPort)應(yīng)該與Pod內(nèi)容器的容器端口(containerPort)匹配;

服務(wù)端口可以是任何數(shù)字。多個(gè)服務(wù)也可以使用同一端口,因?yàn)樗鼈兎峙淞瞬煌腎P地址。

直觀圖示

1. 考慮服務(wù)下Pod公開(kāi)的端口

 

圖解Kubernetes應(yīng)用部署

 

2.創(chuàng)建Pod時(shí),應(yīng)為Pod中的每個(gè)容器定義端口containerPort。

 

圖解Kubernetes應(yīng)用部署

 

3.創(chuàng)建服務(wù)時(shí),可以定義端口和目標(biāo)端口。但是只能用目標(biāo)端口連接容器

 

圖解Kubernetes應(yīng)用部署

 

4.目標(biāo)端口和容器端口應(yīng)該匹配。

 

圖解Kubernetes應(yīng)用部署

 

5. 如果容器公開(kāi)了端口3000,則targetPort應(yīng)該與該數(shù)字匹配。

 

圖解Kubernetes應(yīng)用部署

 

如果查看YAML,則標(biāo)簽和ports/targetPor應(yīng)該匹配:

 

圖解Kubernetes應(yīng)用部署

 

常見(jiàn)問(wèn)題

那么部署頂部track: canary標(biāo)簽是干什么的?

需要應(yīng)該匹配嗎?

部署的track: canary標(biāo)簽屬于部署,服務(wù)選擇器沒(méi)有使用它來(lái)做流量調(diào)度。所以這個(gè)標(biāo)簽完全可以刪除,或者為它分配其他值。

matchLabels選擇器呢?

它必須與Pod標(biāo)簽匹配,部署用它來(lái)跟蹤Pod。

Pod配置修改,如何測(cè)試?

我們可以使用以下命令檢查Pod的標(biāo)簽是否正確:

kubectl get pods --show-labels

對(duì)于屬于多個(gè)應(yīng)用程序的Pod使用:

kubectl get pods --selector any-name=my-app --show-labels

其中any-name = my-app表示標(biāo)簽any-name:my-app。

或者可以直接連接到Pod:可以使用kubectl port-forward命令連接到服務(wù)并測(cè)試連接。

kubectl port-forward service/ 3000:80

其中,service/是服務(wù)的名稱,比如示例中為" my-service";3000是希望在計(jì)算機(jī)上打開(kāi)的端口;80是"服務(wù)"在"端口"字段中公開(kāi)的端口。

如果可以連接,則說(shuō)明設(shè)置正確。如果不能,則很可能配置了標(biāo)簽,或者端口不匹配。

服務(wù)和入口連接

應(yīng)用程序發(fā)布的最后一個(gè)一步是配置Ingress入口。

關(guān)鍵點(diǎn)

入口必須知道如何檢索服務(wù),然后檢索Pod并將流量調(diào)度到它們。入口按名稱和公開(kāi)的端口來(lái)檢索服務(wù)。

在入口和服務(wù)中應(yīng)該匹配兩件事:

  • Ingress的servicePort應(yīng)該與Service的端口匹配
  • Ingress的serviceName應(yīng)該與Service的名稱匹配

直觀圖示

首先,已經(jīng)該服務(wù)發(fā)布了一個(gè)端口。

 

圖解Kubernetes應(yīng)用部署

 

其次,入口中有一個(gè)名為服務(wù)端口(servicePort)的字段。

 

圖解Kubernetes應(yīng)用部署

 

在次,服務(wù)端口和入口服務(wù)端口應(yīng)始終匹配。

 

圖解Kubernetes應(yīng)用部署

 

最后,如果為服務(wù)分配了端口80,也應(yīng)將其servicePort更改為80。

 

圖解Kubernetes應(yīng)用部署

 

先示例配置要注意的字段:

 

圖解Kubernetes應(yīng)用部署

 

常見(jiàn)問(wèn)題

如何測(cè)試入口的功能?

可以對(duì)kubectl port-forward使用與之前相同的策略,但是應(yīng)該連接到Ingress控制器,而不是連接到服務(wù)。

首先,使用以下命令檢索Ingress控制器的Pod名稱:

kubectl get pods --all-namespaces

 

圖解Kubernetes應(yīng)用部署

 

對(duì)確認(rèn)的Ingress Pod(可能在不同的命名空間中)執(zhí)行下面命令:

kubectl describe pod nginx-ingress-controller-6fc5bcc --namespace kube-system|grep Ports

 

圖解Kubernetes應(yīng)用部署

 

用得到端口連接到Pod:

kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-system

這樣訪問(wèn)計(jì)算機(jī)上的端口3000時(shí),請(qǐng)求都會(huì)被轉(zhuǎn)發(fā)到Ingress控制器Pod上的端口80。你訪問(wèn)localhost:3000,就能看到發(fā)布的應(yīng)用程序。

總結(jié)

最后,我們總結(jié)回顧一下哪些端口和標(biāo)簽應(yīng)該匹配點(diǎn):

服務(wù)選擇器應(yīng)與Pod的標(biāo)簽匹配;

服務(wù)目標(biāo)端口(targetPort)應(yīng)該與Pod內(nèi)的容器的容器端口(containerPort)相匹配;

服務(wù)端口可以是任何數(shù)字。多個(gè)服務(wù)可以使用同一端口,因?yàn)樗鼈兎峙淞瞬煌腎P地址;

入口的服務(wù)端口servicePort應(yīng)該與服務(wù)中的端口相匹配;

服務(wù)的名稱應(yīng)與入口中的字段服務(wù)名(serviceName)相匹配。

責(zé)任編輯:華軒 來(lái)源: 今日頭條
相關(guān)推薦

2019-10-24 10:25:32

Kubernetes網(wǎng)絡(luò)集群

2015-07-01 13:34:22

Kubernetes應(yīng)用部署模型

2020-12-11 19:06:03

Kubernetes工具應(yīng)用程序

2022-03-15 11:01:39

KubernetesLinux平滑升級(jí)

2019-12-09 10:40:15

YAMLBashKubernetes

2020-09-29 10:15:54

開(kāi)發(fā)技能Kubernetes

2021-11-02 08:41:44

Kubernetes Nginx部開(kāi)源

2019-11-07 14:00:36

MySQL數(shù)據(jù)庫(kù)SQL

2023-02-06 07:41:27

2020-12-04 18:44:29

KubernetesHTTPS Wordpress

2022-08-21 16:50:36

Kubeadm?Kubernetes

2018-08-16 17:25:20

阿里云ServerlessKubernetes

2020-11-25 15:49:38

Kubernetes程序技巧

2021-11-02 17:27:40

部署高可用Kubernetes

2021-12-27 10:40:13

Kubernetes網(wǎng)絡(luò)圖解Linux

2020-04-02 09:58:26

Kubernetes容器開(kāi)發(fā)

2017-01-05 09:18:12

容器Docker

2013-03-12 10:54:49

云安全云計(jì)算

2022-03-21 08:23:22

Kubernetes容器密鑰

2023-05-10 15:38:14

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)