master节点部署pod_小伙!Kubernetes 部署如此简单,你看完全明白了
將項(xiàng)目遷移到k8s平臺(tái)是怎樣實(shí)現(xiàn)的?
1、制作鏡像分為三步
- 第一基礎(chǔ)鏡像,是基于哪個(gè)操作系統(tǒng),比如Centos7或者其他的
- 第二步中間件鏡像,比如服務(wù)鏡像,跑的像nginx服務(wù),tomcat服務(wù)
- 第三步項(xiàng)目鏡像,它是服務(wù)鏡像之上的,將你的項(xiàng)目打包進(jìn)去,那么這個(gè)項(xiàng)目就能在你這個(gè)服務(wù)鏡像里面運(yùn)行了
一般運(yùn)維人員都是提前將鏡像做好,而開(kāi)發(fā)人員就能直接拿這個(gè)鏡像去用,這個(gè)鏡像一定要符合現(xiàn)在環(huán)境部署的環(huán)境。
2、控制器管理 pod
也就是k8s去部署這個(gè)鏡像了,一般我們都會(huì)去拿控制器去部署,用的最多的就是 deployment
- Deployment:無(wú)狀態(tài)部署
- StatefulSet:有狀態(tài)部署
- DaemonSet:守護(hù)進(jìn)程部署
- Job & CronJob:批處理
無(wú)狀態(tài)和有狀態(tài)的有什么區(qū)別?
有狀態(tài)的是有身份的,比如網(wǎng)絡(luò)ID、存儲(chǔ)、這個(gè)兩個(gè)是提前規(guī)劃好的,有序啟動(dòng)/停止
持久化與非持久化
3、Pod 數(shù)據(jù)持久化
pod數(shù)據(jù)持久化主要是因?qū)σ粋€(gè)應(yīng)用程序說(shuō)的,比如開(kāi)發(fā)一個(gè)項(xiàng)目,這個(gè)項(xiàng)目有沒(méi)有落地到本地文件,如果有落的話,就保證他持久的有了,那就必須要用到pod數(shù)據(jù)的持久化了。
容器部署過(guò)程中一般有以下三種數(shù)據(jù):
- 啟動(dòng)時(shí)需要的初始數(shù)據(jù),可以是配置文件
- 啟動(dòng)過(guò)程中產(chǎn)生的臨時(shí)數(shù)據(jù),該臨時(shí)數(shù)據(jù)需要多個(gè)容器間共享
- 啟動(dòng)過(guò)程中產(chǎn)生的持久化數(shù)據(jù)
4、暴露應(yīng)用
在 k8s中,部署一個(gè)deployment,它是無(wú)法對(duì)外進(jìn)行訪問(wèn)的,即其他應(yīng)用程序要想訪問(wèn)部署的deployment,它找不到該怎么去訪問(wèn)。為什么去這么講,因?yàn)閐eployment一般都是多副本的去部署,有可能會(huì)分布在不同的節(jié)點(diǎn)之上,而且重建 pod ip也會(huì)變,重新發(fā)布一下也會(huì)變了,所以沒(méi)有辦法去固定去訪問(wèn)哪個(gè)pod,即使固定了,其他的pod也訪問(wèn)不了。
要想做到多個(gè) pod 都去提供服務(wù)的話,前面有必須要加一個(gè)負(fù)載均衡,提供一個(gè)訪問(wèn)入口,只有訪問(wèn)這個(gè)統(tǒng)一入口,才能轉(zhuǎn)發(fā)到后端多個(gè)pod上,只要訪問(wèn)這個(gè)Cluster IP就能轉(zhuǎn)發(fā)到后端的pod上。
Service
- Service 定義了 Pod 的邏輯集合和訪問(wèn)這個(gè)集合的策略
- Service 引入為了解決Pod的動(dòng)態(tài)變化,提供服務(wù)發(fā)現(xiàn)和負(fù)載均衡
- 使用 CoreDNS 解析 Service 名稱
5、對(duì)外發(fā)布應(yīng)用
暴露出去之后呢,也就是需要讓用戶去訪問(wèn),比如搭建一個(gè)電商網(wǎng)站,讓用戶去訪問(wèn),ingress相對(duì)于service,它是一個(gè)互補(bǔ)的狀態(tài),彌補(bǔ)了各自,service主要提供了集群內(nèi)部的訪問(wèn),也可以暴露一個(gè)TCP/UDP的端口,而ingress主要是一個(gè)7層的轉(zhuǎn)發(fā),也就是提供一個(gè)統(tǒng)一的入口,只要訪問(wèn)ingress controller,它就能幫你轉(zhuǎn)發(fā)你部署所有的項(xiàng)目,也就是所有的項(xiàng)目都使用域名去訪問(wèn)。
首先開(kāi)發(fā)者將代碼部署到你的代碼倉(cāng)庫(kù)中,主流的用的Git或者gitlab,提交完代碼通過(guò)CI/CD平臺(tái)需要對(duì)代碼進(jìn)行拉取、編譯、構(gòu)建,產(chǎn)生一個(gè)War包,然后交給Ansible然后發(fā)送到云主機(jī)上/物理機(jī),然后通過(guò)負(fù)載均衡將項(xiàng)目暴露出去,然后會(huì)有數(shù)據(jù)庫(kù),監(jiān)控系統(tǒng),日志系統(tǒng)來(lái)提供相關(guān)的服務(wù)。
首先也是開(kāi)發(fā)將代碼放在代碼倉(cāng)庫(kù),然后通過(guò)jenkins去完成拉取代碼,編譯,上傳到我們的鏡像倉(cāng)庫(kù)。
這里是將代碼打包成一個(gè)鏡像,而不是可以執(zhí)行的war或者jar包,這個(gè)鏡像包含了你的項(xiàng)目的運(yùn)行環(huán)境和項(xiàng)目代碼,這個(gè)鏡像可以放在任何docker上去run起來(lái),都可以去訪問(wèn),首先得保證能夠在docker上去部署起來(lái),再部署到k8s上,打出來(lái)的鏡像去放在鏡像倉(cāng)庫(kù)中,來(lái)集中的去管理這些鏡像。
因?yàn)槊刻鞎?huì)產(chǎn)生幾十個(gè)或者上百個(gè)鏡像,必須通過(guò)鏡像倉(cāng)庫(kù)去管理,這里可能會(huì)去寫(xiě)一個(gè)腳本去連接k8smaster,而k8s會(huì)根據(jù)自己的部署去調(diào)度這些pod,然后通過(guò)ingress去發(fā)布我們的應(yīng)用,讓用戶去訪問(wèn),每個(gè)ingress會(huì)關(guān)聯(lián)一組pod,而service會(huì)創(chuàng)建這組pod的負(fù)載均衡,通過(guò)service去區(qū)分這些節(jié)點(diǎn)上的Pod。
然后數(shù)據(jù)庫(kù)是放在集群之外,監(jiān)控系統(tǒng)日志系統(tǒng)也可以放在k8s集群放在去部署,也可以放在之外,我們是放在k8s集群內(nèi)的,也不是特別敏感,主要用來(lái)運(yùn)維和開(kāi)發(fā)調(diào)試用的,不會(huì)影響到我們的業(yè)務(wù),所以我們優(yōu)先去k8s中去部署。
現(xiàn)在以部署一個(gè)JAVA項(xiàng)目到我們的k8s中
一、安裝一個(gè)openjdk
[root@k8s-master ~]# yum -y install java-1.8.0-openjdk.x86_64 maven [root@k8s-master ~]# java -version openjdk version "1.8.0_222" OpenJDK Runtime Environment (build 1.8.0_222-b10) OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)然后我們將代碼拉到本地一般Dockerfile中跟我們的代碼都放在同一目錄下,
[root@k8s-master tomcat-java-demo-master]# ls db Dockerfile LICENSE pom.xml README.md src [root@k8s-master tomcat-java-demo-master]# vim Dockerfile FROM lizhenliang/tomcat LABEL maintainer zhaochengcheng RUN rm -rf /usr/local/tomcat/webapps/* ADD target/*.war /usr/local/tomcat/webapps/ROOT.war二、進(jìn)行編譯
這里我們需要配置maven的國(guó)內(nèi)源,這樣的話就比較快一點(diǎn)
[root@k8s-master CI]# vim /etc/maven/settings.xml <mirror> <id>central</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors> [root@k8s-master tomcat-java-demo-master]# mvn clean package -D maven test.skip=true [root@k8s-master tomcat-java-demo-master]# ls db Dockerfile LICENSE pom.xml README.md src target [root@k8s-master tomcat-java-demo-master]# cd target/ [root@k8s-master target]# ls classes generated-sources ly-simple-tomcat-0.0.1-SNAPSHOT ly-simple-tomcat-0.0.1-SNAPSHOT.war maven-archiver maven-status [root@k8s-master tomcat-java-demo-master]# cd target/我們就使用這個(gè)編譯好的war包,然后打成鏡像,上傳到我們的Harbor倉(cāng)庫(kù)里
[root@k8s-master target]# ls classes ly-simple-tomcat-0.0.1-SNAPSHOT maven-archivergenerated-sources ly-simple-tomcat-0.0.1-SNAPSHOT.war maven-status[root@k8s-master tomcat-java-demo-master]# docker build -t 192.168.30.24/library/java-demo:latest .三、上傳到鏡像倉(cāng)庫(kù)
[root@k8s-master tomcat-java-demo-master]# docker login 192.168.30.24 Username: admin Password: Error response from daemon: Get https://192.168.30.24/v2/: dial tcp 192.168.30.24:443: connect: connection refused這里報(bào)錯(cuò),其實(shí)我們需要在每臺(tái)docker下都要寫(xiě)入對(duì)harbor倉(cāng)庫(kù)的信任才可以,后面上傳鏡像也會(huì)用
[root@k8s-master java-demo]# vim /etc/docker/daemon.json { "registry-mirrors":["http://f1361db2.m.daocloud.io"], "insecure-registries": ["192.168.30.24"]}再等錄一下push就可以了
[root@k8s-master tomcat-java-demo-master]# docker push 192.168.30.24/library/java-demo:latest四、控制器管理pod
編寫(xiě)deployment,一般項(xiàng)目都寫(xiě)到自定義的命名空間下,名稱寫(xiě)項(xiàng)目名稱,方便記憶,name: tomcat-java-demo
namespace: test
另外就是下一個(gè)項(xiàng)目名稱,這里分為多個(gè),一般有很多的組件組成,所以下面可以寫(xiě)個(gè)app的名稱,比如組件1、2、3,起碼標(biāo)簽有這兩個(gè)維度
project: www
app: java-demo
另外就是鏡像拉取,在哪個(gè)倉(cāng)庫(kù)去下載,這里我建議鏡像倉(cāng)庫(kù)的項(xiàng)目名稱和我們定義的是一種,避免混了。我重新打個(gè)標(biāo)簽,并傳到我們的私有鏡像倉(cāng)庫(kù)中
[root@k8s-master java-demo]# docker tag 192.168.30.24/library/java-demo 192.168.30.24/tomcat-java-demo/java-demo[root@k8s-master java-demo]# docker push 192.168.30.24/tomcat-java-demo/java-demo:latest鏡像地址也改一下地址
imagePullSecrets: - name: registry-pull-secret containers: - name: tomcat image: 192.168.30.24/tomcat-java-demo/java-demo:latest現(xiàn)在開(kāi)始創(chuàng)建 yaml
創(chuàng)建項(xiàng)目的命名空間
[root@k8s-master java-demo]# vim namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test [root@k8s-master java-demo]# kubectl create -f namespace.yaml namespace/test created [root@k8s-master java-demo]# kubectl get ns NAME STATUS AGE default Active 22h kube-node-lease Active 22h kube-public Active 22h kube-system Active 22h test Active 5s創(chuàng)建一個(gè)secret來(lái)保證我們harbor鏡像倉(cāng)庫(kù)的認(rèn)證信息,這里一定要寫(xiě)上我們的項(xiàng)目的命名空間。
[root@k8s-master java-demo]# kubectl create secret docker-registry registry-pull-secret --docker-username=admin --docker-password=Harbor12345 --docker-email=111@qq.com --docker-server=192.168.30.24 -n test secret/registry-pull-secret created [root@k8s-master java-demo]# kubectl get ns NAME STATUS AGE default Active 23h kube-node-lease Active 23h kube-public Active 23h kube-system Active 23h test Active 6m39s [root@k8s-master java-demo]# kubectl get secret NAME TYPE DATA AGE default-token-2vtgm kubernetes.io/service-account-token 3 23h registry-pull-secret kubernetes.io/dockerconfigjson 1 46s [root@k8s-master java-demo]# vim deployment.yaml apiVersion: apps/v1beta1 kind: Deployment metadata: name: tomcat-java-demo namespace: test spec: replicas: 3 selector: matchLabels: project: www app: java-demo template: metadata: labels: project: www app: java-demo spec: imagePullSecrets: - name: registry-pull-secret containers: - name: tomcat image: 192.168.30.24/tomcat-java-demo/java-demo:latest imagePullPolicy: Always ports: - containerPort: 8080 name: web protocol: TCP resources: requests: cpu: 0.5 memory: 1Gi limits: cpu: 1 memory: 2Gi livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 60 timeoutSeconds: 20 readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 60 timeoutSeconds: 20 [root@k8s-master java-demo]# kubectl get pod -n test NAME READY STATUS RESTARTS AGE tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 2m58s tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 2m58s tomcat-java-demo-6d798c6996-strth 1/1 Running 0 2m58s另外就是暴露一個(gè)Service,這里的標(biāo)簽也要保持一致,不然他找不到相應(yīng)的標(biāo)簽就提供不了服務(wù),這里我們是使用ingress來(lái)訪問(wèn)發(fā)布應(yīng)該,直接使用ClusterIP就可以
[root@k8s-master java-demo]# vim service.yaml apiVersion: v1 kind: Service metadata: name: tomcat-java-demo namespace: test spec: selector: project: www app: java-demo ports: - name: web port: 80 targetPort: 8080 [root@k8s-master java-demo]# kubectl get pod,svc -n test NAME READY STATUS RESTARTS AGE pod/tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 37m pod/tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 37m pod/tomcat-java-demo-6d798c6996-strth 1/1 Running 0 37m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/tomcat-java-demo ClusterIP 10.1.175.191 <none> 80/TCP 19s測(cè)試訪問(wèn)我們的項(xiàng)目,是可以的,現(xiàn)在要發(fā)布出去通過(guò)ingress
測(cè)試訪問(wèn)我們的項(xiàng)目,是可以的,現(xiàn)在要發(fā)布出去通過(guò)ingress
[root@k8s-master java-demo]# curl 10.1.175.191 <!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>把美女帶回家應(yīng)用案例</title> <meta name="description" content="把美女帶回家應(yīng)用案例"> <meta name="keywords" content="index">現(xiàn)在部署一個(gè)ingress-nginx的控制器,這個(gè)網(wǎng)上都可以找到,官方也有,我這里是按DaemonSet的方式去部署的,所以每個(gè)節(jié)點(diǎn)都會(huì)跑一個(gè)控制器。
[root@k8s-master java-demo]# kubectl get pod -n ingress-nginx NAME READY STATUS RESTARTS AGE nginx-ingress-controller-g95pp 1/1 Running 0 3m6s nginx-ingress-controller-wq6l6 1/1 Running 0 3m6s發(fā)布應(yīng)用
這里注意兩點(diǎn),第一個(gè)就是網(wǎng)站域名,一個(gè)是service的命名空間。
[root@k8s-master java-demo]# kubectl get pod,svc -n test NAME READY STATUS RESTARTS AGE pod/tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 53m pod/tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 53m pod/tomcat-java-demo-6d798c6996-strth 1/1 Running 0 53m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/tomcat-java-demo ClusterIP 10.1.175.191 <none> 80/TCP 16m [root@k8s-master java-demo]# vim service.yaml [root@k8s-master java-demo]# kubectl create -f ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: tomcat-java-demo namespace: test spec: rules: - host: java.maidikebi.com http: paths: - path: / backend: serviceName: tomcat-java-demo servicePort: 80另外我這邊是測(cè)試的,所以綁定我本地的hosts來(lái)進(jìn)行訪問(wèn),在hosts文件里面加入域名和和節(jié)點(diǎn)ip就能訪問(wèn)到我們的項(xiàng)目了。
來(lái)源:Kubernetes運(yùn)維之部署主流JAVA應(yīng)用- 升職加薪必備!運(yùn)維工程師打怪升級(jí)進(jìn)階成神之路
- 我沒(méi)有開(kāi)掛的人生!自律和堅(jiān)持,是我走IT之路的唯一捷徑
- 全網(wǎng)最新、最全Linux面試題(2020版)!
- 史上最全、最新的Redis面試題(2020最新版)!
- 贊!7000 字學(xué)習(xí)筆記,MySQL 從入門(mén)到放棄
如有錯(cuò)誤或其它問(wèn)題,歡迎小伙伴留言評(píng)論、指正。如有幫助,歡迎點(diǎn)贊+轉(zhuǎn)發(fā)分享。
更多相關(guān)開(kāi)源技術(shù)文章,請(qǐng)持續(xù)關(guān)注民工哥知乎技術(shù)專欄。
我是民工哥,一個(gè)愛(ài)折騰的IT技術(shù)老司機(jī),歡迎關(guān)注我,我們一起學(xué)習(xí),共同成長(zhǎng)!!
總結(jié)
以上是生活随笔為你收集整理的master节点部署pod_小伙!Kubernetes 部署如此简单,你看完全明白了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一头华发梳得整齐,一袭素衣低调谦逊。她是
- 下一篇: 高杰:对撞机的历史回顾与展望