該demo主要作為一個dubbo項目通過maven自動化docker打包插件發布到鏡像倉庫樣例工程。該wiki后面同時會提供k8s部署zk,mysql,應用包的整個過程。該項目大體功能:zk作為注冊中心,服務端發布服務,消費端訂閱服務,在調用過程中訪問mysql數據庫。
環境准備:k8s集群,以及配置好kubectl客戶端工具.
項目源碼:https://github.com/HushAsy/demo
1.provider,consumer鏡像制作:
關於自動化鏡像發布,可以參考我的另一篇文章:https://www.cnblogs.com/HushAsy/p/9896196.html
此處貼出Dockerfile文件:
FROM registry.cn-hangzhou.aliyuncs.com/hush/basecontainer:20180929 #添加本地jar包 RUN mkdir -p /home/admin/app/ RUN mkdir -p /home/admin/tomcat/ ENV CATALINA_HOME /home/admin/tomcat/ # ARG JAR_FILE ADD target/${JAR_FILE} /home/admin/app/ # # # # 將啟動命令寫入啟動腳本 start.sh RUN echo "$JAVA_HOME/bin/java -jar $JAVA_OPTS -Ddubbo.address.ip=$POD_IP -Djava.security.egd=file:/dev/./urandom /home/admin/app/${JAR_FILE} --spring.profiles.active=prod" > /home/admin/start.sh && chmod +x /home/admin/start.sh WORKDIR $CATALINA_HOME ENTRYPOINT ["/bin/bash", "/home/admin/start.sh"]
2.mysql-app.yaml
#mysql-app.yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql labels: app: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - image: registry-vpc.cn-hangzhou.aliyuncs.com/hush/dubbo_mysql name: mysql env: - name: MYSQL_ROOT_PASSWORD value: "123456" ports: - containerPort: 3306 name: mysql
#在客戶端提交yaml文件創建pod
kubectl create -f mysql-app.yaml
#創建成功后,執行下面命名可以看到當前pod執行情況
kubectl get pods
3.mysql service yaml配置
#mysql-srv.yaml
apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql
4.zk.yaml配置
--- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: zk-0 spec: replicas: 1 template: metadata: labels: app: zk node: node0 spec: hostname: zk-0 volumes: - name: zk-data hostPath: path: /data/zk-cluster/zk-data-0 - name: zk-logs hostPath: path: /data/zk-cluster/zk-logs-0 containers: - name: zk-0 image: registry-vpc.cn-hangzhou.aliyuncs.com/hush/dubbo_zk imagePullPolicy: IfNotPresent volumeMounts: - name: zk-data readOnly: false mountPath: "/data/zk-data" - name: zk-logs readOnly: false mountPath: "/data/zk-logs" ports: - containerPort: 2181 - containerPort: 2888 - containerPort: 3888 #command: ['tail', '-f', '/etc/hosts'] env: - name: ZOO_MY_ID value: '0' - name: ZOO_SERVERS # 注意!!k8s使用到virtual ip,因此,本機必須使用0.0.0.0 ip地址,否則本機zk啟動會異常: # ERROR [zk1/10.0.0.251:3888:QuorumCnxManager$Listener@547] - Exception while listening # java.net.BindException: Address not available (Bind failed)錯誤 value: server.0=0.0.0.0:2888:3888 server.1=zk-1:2888:3888 server.2=zk-2:2888:3888 - name: ZOO_DATA_DIR value: '/data/zk-data' - name: ZOO_DATA_LOG_DIR value: '/data/zk-logs' --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: zk-1 spec: replicas: 1 template: metadata: labels: app: zk node: node1 spec: hostname: zk-1 volumes: - name: zk-data hostPath: path: /data/zk-cluster/zk-data-1 - name: zk-logs hostPath: path: /data/zk-cluster/zk-logs-1 containers: - name: zk-1 image: registry-vpc.cn-hangzhou.aliyuncs.com/hush/dubbo_zk imagePullPolicy: IfNotPresent volumeMounts: - name: zk-data readOnly: false mountPath: "/data/zk-data" - name: zk-logs readOnly: false mountPath: "/data/zk-logs" ports: - containerPort: 2181 - containerPort: 2888 - containerPort: 3888 #command: ['tail', '-f', '/etc/hosts'] env: - name: ZOO_MY_ID value: '1' - name: ZOO_SERVERS # 注意!!k8s使用到virtual ip,因此,本機必須使用0.0.0.0 ip地址,否則本機zk啟動會異常: # ERROR [zk1/10.0.0.251:3888:QuorumCnxManager$Listener@547] - Exception while listening # java.net.BindException: Address not available (Bind failed)錯誤 value: server.0=zk-0:2888:3888 server.1=0.0.0.0:2888:3888 server.2=zk-2:2888:3888 - name: ZOO_DATA_DIR value: '/data/zk-data' - name: ZOO_DATA_LOG_DIR value: '/data/zk-logs' --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: zk-2 spec: replicas: 1 template: metadata: labels: app: zk node: node2 spec: hostname: zk-2 volumes: - name: zk-data hostPath: path: /data/zk-cluster/zk-data-2 - name: zk-logs hostPath: path: /data/zk-cluster/zk-logs-2 containers: - name: zk-2 image: registry-vpc.cn-hangzhou.aliyuncs.com/hush/dubbo_zk imagePullPolicy: IfNotPresent volumeMounts: - name: zk-data readOnly: false mountPath: "/data/zk-data" - name: zk-logs readOnly: false mountPath: "/data/zk-logs" ports: - containerPort: 2181 - containerPort: 2888 - containerPort: 3888 #command: ['tail', '-f', '/etc/hosts'] env: - name: ZOO_MY_ID value: '2' - name: ZOO_SERVERS # 注意!!k8s使用到virtual ip,因此,本機必須使用0.0.0.0 ip地址,否則本機zk啟動會異常: # ERROR [zk1/10.0.0.251:3888:QuorumCnxManager$Listener@547] - Exception while listening # java.net.BindException: Address not available (Bind failed)錯誤 value: server.0=zk-0:2888:3888 server.1=zk-1:2888:3888 server.2=0.0.0.0:2888:3888 - name: ZOO_DATA_DIR value: '/data/zk-data' - name: ZOO_DATA_LOG_DIR value: '/data/zk-logs'
5.zk service yaml配置
--- kind: Service apiVersion: v1 metadata: name: zk-0 labels: app: zk node: node0 spec: type: LoadBalancer ports: - name: port-2181 port: 2181 - name: port-2888 port: 2888 - name: port-3888 port: 3888 selector: app: zk node: node0 --- kind: Service apiVersion: v1 metadata: name: zk-1 labels: app: zk node: node1 spec: type: LoadBalancer ports: - name: port-2181 port: 2181 - name: port-2888 port: 2888 - name: port-3888 port: 3888 selector: app: zk node: node1 --- kind: Service apiVersion: v1 metadata: name: zk-2 labels: app: zk node: node2 spec: type: LoadBalancer ports: - name: port-2181 port: 2181 - name: port-2888 port: 2888 - name: port-3888 port: 3888 selector: app: zk node: node2
6.部署provider yaml
apiVersion: apps/v1 kind: Deployment metadata: name: provider labels: app: provider spec: replicas: 1 selector: matchLabels: app: provider template: metadata: labels: app: provider spec: containers: - name: provider image: <鏡像地址> ports: - containerPort: 20880
7.consumer deployment yaml
apiVersion: apps/v1 kind: Deployment metadata: name: consumer labels: app: consumer spec: replicas: 1 selector: matchLabels: app: consumer template: metadata: labels: app: consumer spec: containers: - name: consumer image: <鏡像地址> ports: - containerPort: 8080
8.consumer service yaml
kind: Service apiVersion: v1 metadata: name: consumer_svc spec: selector: app: consumer ports: - protocol: TCP port: 8080
9. 前端訪問控制 ingress 可以瞅瞅這位哥寫的博客:https://mritd.me/2017/03/04/how-to-use-nginx-ingress/
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: <host> http: paths: - path: /index backend: serviceName: consumer_svc servicePort: 8080
通過對應域名或ip訪問 完美