一个简单的例子
一、启动MySQL服务
1.1 为MySQL服务创建一个RC定义
mysql-rc.yaml
apiVersion: v1 kind: ReplicationController # 副本控制器RC metadata: name: mysql # RC的名称,全局唯一 spec: replicas: 1 # Pod副本的期待数量 selector: app: mysql # 符合目标的Pod拥有此标签 template: metadata: labels: app: mysql # Pod副本的标签,对应RC的Selector spec: containers: # Pod内容器的定义部分 - name: mysql # 容器的名称 image: mysql:5.6 # 容器对应的Docker Image imagePullPolicy: IfNotPresent ports: - containerPort: 3306 # 容器应用监听的端口号 env: # 注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD value: "123456"
1.2 发布到kubernetes集群
创建RC
kubectl create -f mysql-rc.yaml
验证是否成功
查看刚才创建的RC
kubectl get rc
NAME DESIRED CURRENT READY AGE mysql 1 1 0 10s
查看Pod创建情况
kubectl get pod NAME READY STATUS RESTARTS AGE mysql-lh5dv 1/1 Running 0 2m39s
二、创建MySQL Kubernetes Service
2.1 定义一个service
mysql-scv.yaml
apiVersion: v1 kind: Service # 表明是 Kubernetes Service metadata: name: mysql # Service 的全局唯一名称 spec: ports: - port: 3306 # Service 提供服务的端口号 selector: # Service 对应的Pod拥有这里定义的标签 app: mysql
2.2 创建Service
kubectl create -f mysql-scv.yaml
查看创建的Service
kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h48m mysql ClusterIP 10.109.55.96 <none> 3306/TCP 7s
可以发现,MySQL服务被分配了一个值为10.109.55.96的Cluser IP地址。Kubernetes集群中其他Pod就能通过Service的Cluster IP + 端口号3306来访问mysql了。通常Cluster IP是系统自动分配的,因此需要一个服务发现机制来找到这个服务(Coer DNS就能通过Service的名称来发现该服务)。最初Kubernetes巧妙的使用Linux环境变量来解决了这个问题。根据Service的唯一名称,容器可以从环境变量中获取Service对应的Cluster IP地址和端口,从而发起TCP/IP连接请求。
三、启动Tomcat应用
3.1 创建对应的RC
myweb-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 1 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql' - name: MYSQL_SERVICE_PORT value: '3306'
在这里使用了环境变量的形式传入mysql的相关信息,更安全的方法是使用服务的名称mysql。
3.2 将应用发布到集群
# kubectl create -f myweb-rc.yaml # kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 1 22m myweb 1 1 0 28s
3.3 创建对应的Service
myweb-svc.yaml
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
创建service
# kubectl create -f myweb-svc.yaml
service/myweb created
查看service
# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h mysql ClusterIP 10.109.55.96 <none> 3306/TCP 25m myweb NodePort 10.111.193.215 <none> 8080:30001/TCP 53s
至此一个应用例子搭建完成
通过浏览器访问 nodeip:30001访问Tomcat