一 用k8s部署微服務應用
以我們之前用docker部署過的eureka應用為例,首先添加配置文件eureka-app-deployment.yaml用于創建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: eureka-app-deployment # deployment名字labels:app: eureka-app
spec:replicas: 1 #副本個數selector:matchLabels:app: eureka-app template:metadata:labels:app: eureka-appspec:containers:- name: eureka-app #pod名字# 指定Docker Hub中的鏡像地址image: zhuge666/microservice-eureka-server:0.0.1ports:- containerPort: 8761 # 容器內部端口
通過應用配置文件來創建一個Deployment部署
kubectl apply -f eureka-app-deployment.yaml
查看下deploy和pod信息
kubectl get deploy,pod
我們可以通過kubectl logs命令來查看應用的啟動日志
kubectl logs -f pod/eureka-app-deployment-7cd4b6f4d4-lkzs4
如果想要從外部訪問應用,需要創建Service,添加配置文件eureka-app-service.yaml用于創建Service
apiVersion: v1
kind: Service
metadata:name: eureka-app-service
spec:type: NodePortselector:app: eureka-app #選擇有該標簽的pod容器ports:- name: httpprotocol: TCPport: 8761 #service的端口targetPort: 8761 #pod的端口,一般與pod內部容器的服務端口一致
通過應用配置文件來創建Service
kubectl apply -f eureka-app-service.yaml
查看服務Service信息
[macro@linux-local k8s]$ kubectl get services
此時就可以通過外網來訪問了:http://192.168.65.160:30558/
二 用k8s部署電商項目微服務
以電商微服務里的product服務為例,我們來創建對應的deployment和service,做之前需要把商品服務做成鏡像推到docker鏡像倉庫里去,參考之前的docker章節。
docker login
docker tag mall/tulingmall-product:0.0.1 zhuge666/tulingmall-product:0.0.1
docker push zhuge666/tulingmall-product:0.0.1
新增文件tulingmall-product-deployment.yaml,內容如下:
apiVersion: apps/v1
kind: Deployment
metadata:name: tulingmall-product-deploymentlabels:app: tulingmall-product
spec:replicas: 1selector:matchLabels:app: tulingmall-producttemplate:metadata:labels:app: tulingmall-productspec:containers:- name: tulingmall-productimage: zhuge666/tulingmall-product:0.0.1#imagePullPolicy: Always # 1)Always 總是拉取鏡像, 2)IfNotPresent(默認該值) 本地有則使用本地鏡像,3)Never 只使用本地鏡像,從不拉取,即使本地沒有鏡像ports:- containerPort: 8866env: # 環境- name: TZvalue: Asia/Shanghai- name: spring.cloud.nacos.config.server-addr # 指定配置中心nacosvalue: 192.168.65.42:8848- name: LOG_FILEvalue: /var/logsvolumeMounts:- mountPath: /var/logs #容器日志目錄(掛載到下邊的宿主機目錄)name: log-volumevolumes:- name: log-volumehostPath:path: /mydata/k8s-app/tulingmall-product/logs #宿主機目錄type: DirectoryOrCreatednsPolicy: Default #繼承Pod所在宿主機的DNS設置,使pod能訪問外網
配置環境變量
執行如下命令創建商品服務的deployment:
kubectl apply -f tulingmall-product-deployment.yaml
# 查看
kubectl get all
新增文件tulingmall-product-service.yaml,內容如下:
(其實我們實際部署時不需要寫這個文件,因為微服務里有fegin或Ribbion這種內部調用框架去互相調用服務;但是部署gateway時一定要配置對應的service.yaml文件,因為gateway項目是需要外網訪問的)
apiVersion: v1
kind: Service
metadata:name: tulingmall-product-service
spec:type: NodePortselector:app: tulingmall-productports:- name: httpprotocol: TCPport: 8866targetPort: 8866
執行如下命令創建商品服務的service:
kubectl apply -f tulingmall-product-service.yaml
查看商品服務的對外暴露端口:
訪問下查詢商品的接口,如果有json數據返回,代表服務正常:
http://192.168.65.210:30911/pms/productInfo/1
用相同的方法部署下電商里的order,member,gateway,authcenter等服務,這里不一一詳述了,附上每個服務k8s部署的yaml文件供大家參考。
authcenter服務
tulingmall-authcenter-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: tulingmall-authcenter-deploymentlabels:app: tulingmall-authcenter
spec:replicas: 1selector:matchLabels:app: tulingmall-authcentertemplate:metadata:labels:app: tulingmall-authcenterspec:containers:- name: tulingmall-authcenterimage: zhuge666/tulingmall-authcenter:0.0.1imagePullPolicy: Alwaysports:- containerPort: 9999env: - name: TZvalue: Asia/Shanghai- name: spring.cloud.nacos.config.server-addrvalue: 192.168.65.42:8848- name: LOG_FILEvalue: /var/logsvolumeMounts:- mountPath: /var/logsname: log-volumevolumes:- name: log-volumehostPath:path: /mydata/k8s-app/tulingmall-authcenter/logstype: DirectoryOrCreatednsPolicy: Default #繼承Pod所在宿主機的DNS設置,使pod能訪問外網
tulingmall-authcenter-service.yaml
apiVersion: v1
kind: Service
metadata:name: tulingmall-authcenter-service
spec:type: NodePortselector:app: tulingmall-authcenterports:- name: httpprotocol: TCPport: 9999targetPort: 9999
gateway服務
tulingmall-gateway-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: tulingmall-gateway-deploymentlabels:app: tulingmall-gateway
spec:replicas: 1selector:matchLabels:app: tulingmall-gatewaytemplate:metadata:labels:app: tulingmall-gatewayspec:containers:- name: tulingmall-gatewayimage: zhuge666/tulingmall-gateway:0.0.1imagePullPolicy: Alwaysports:- containerPort: 8888env:- name: TZvalue: Asia/Shanghai- name: spring.cloud.nacos.config.server-addrvalue: 192.168.65.42:8848- name: LOG_FILEvalue: /var/logsvolumeMounts:- mountPath: /var/logsname: log-volumevolumes:- name: log-volumehostPath:path: /mydata/k8s-app/tulingmall-gateway/logstype: DirectoryOrCreatednsPolicy: Default #繼承Pod所在宿主機的DNS設置,使pod能訪問外網
tulingmall-gateway-service.yaml
(其他模塊可以不寫自己的service.yaml,gateway需要外網訪問,所以一定要寫service.yaml)
apiVersion: v1
kind: Service
metadata:name: tulingmall-gateway-service
spec:type: NodePortselector:app: tulingmall-gatewayports:- name: httpprotocol: TCPport: 8888targetPort: 8888
order服務
tulingmall-order-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: tulingmall-order-deploymentlabels:app: tulingmall-order
spec:replicas: 1selector:matchLabels:app: tulingmall-ordertemplate:metadata:labels:app: tulingmall-orderspec:containers:- name: tulingmall-orderimage: zhuge666/tulingmall-order:0.0.1imagePullPolicy: Alwaysports:- containerPort: 8844env:- name: TZvalue: Asia/Shanghai- name: spring.cloud.nacos.config.server-addrvalue: 192.168.65.42:8848- name: LOG_FILEvalue: /var/logs- name: JAVA_TOOL_OPTIONSvalue: -Xms1G -Xmx1G -Xmn512M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -javaagent:/agent/skywalking-agent.jar -DSW_AGENT_NAME=tulingmall-order -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.65.204:11800volumeMounts:- mountPath: /var/logsname: log-volumevolumes:- name: log-volumehostPath:path: /mydata/k8s-app/tulingmall-order/logstype: DirectoryOrCreatednsPolicy: Default #繼承Pod所在宿主機的DNS設置,使pod能訪問外網
tulingmall-order-service.yaml
apiVersion: v1
kind: Service
metadata:name: tulingmall-order-service
spec:type: NodePortselector:app: tulingmall-orderports:- name: httpprotocol: TCPport: 8844targetPort: 8844
member服務
tulingmall-member-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: tulingmall-member-deploymentlabels:app: tulingmall-member
spec:replicas: 1selector:matchLabels:app: tulingmall-membertemplate:metadata:labels:app: tulingmall-memberspec:containers:- name: tulingmall-memberimage: zhuge666/tulingmall-member:0.0.1imagePullPolicy: Alwaysports:- containerPort: 8877env:- name: TZvalue: Asia/Shanghai- name: spring.cloud.nacos.config.server-addrvalue: 192.168.65.42:8848- name: LOG_FILEvalue: /var/logs- name: JAVA_TOOL_OPTIONSvalue: -Xmx1g -Xms1g -XX:MaxMetaspaceSize=256m -javaagent:/agent/skywalking-agent.jar -DSW_AGENT_NAME=tulingmall-member -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.65.204:11800volumeMounts:- mountPath: /var/logsname: log-volumevolumes:- name: log-volumehostPath:path: /mydata/k8s-app/tulingmall-member/logstype: DirectoryOrCreatednsPolicy: Default #繼承Pod所在宿主機的DNS設置,使pod能訪問外網
tulingmall-member-service.yaml
apiVersion: v1
kind: Service
metadata:name: tulingmall-member-service
spec:type: NodePortselector:app: tulingmall-memberports:- name: httpprotocol: TCPport: 8877targetPort: 8877
創建網關的Ingress(相當于Nginx)
最后,我們來創建網關服務的Ingress,創建文件tulingmall-gateway-ingress.yaml,內容如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:name: tulingmall-gateway-ingress
spec:rules:- host: gateway.tuling.com #轉發域名http:paths:- path: /backend:serviceName: tulingmall-gateway-serviceservicePort: 8888 #service的端口
執行如下命令生效規則:
kubectl apply -f tulingmall-gateway-ingress.yaml
查看生效的ingress規則:
kubectl get ing
在訪問機器配置host,win10客戶機在目錄:C:\Windows\System32\drivers\etc,在host里增加如下host(ingress部署的機器ip對應訪問的域名)
192.168.65.203 gateway.tuling.com
或者
192.168.65.210 gateway.tuling.com
配置完后直接在客戶機用域名請求下網關: