Docker & K8s学习记录
下载学习代码:
https://github.com/kubeguide/K8sDefinitiveGuide-V4-Sourcecode
启动mysql RC服务
创建RC定义文件 mysql-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql #RC名称,全局唯一
spec:
replicas: 1 #pod副本期待数量
selector:
app: mysql # 符合目标的pod拥有此标签
template: # 根据此模板创建pod副本
metadata:
labels:
app: mysql #pod 副本拥有的标签,对应RC的Selector
spec:
containers: #pod 内容器的定义部分
- name: mysql #容器的名称
image: mysql #容器对应的Docker Image
ports:
- containerPort: 3306 #容器内应用监听的端口号
env: #注入容器内的环境变量
- name: MYSQL_ROOT_PASSWORD
value: "123456"
解析:
-
kind 属性用来表明此资源的类型。如
ReplicationController
表明这是一个RC
。 -
spec 一节中是
RC
的相关属性定义
“当在集群中运行的Pod数量少于replicas时,RC会根据在spec.template一节中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels指定了该Pod的标签,需要特别注意的是:这里的labels必须匹配之前的spec.selector,否则此RC每创建一个无法匹配Label的Pod,就会不停地尝试创建新的Pod,陷入恶性循环中。”
摘录来自: 龚正 等. “Kubernetes权威指南:从Docker到Kubernetes实践全接触。”
roverliang@roverliangdeMac-mini study % kubectl create -f mysql-rc.yaml
replicationcontroller/mysql created
查看刚刚创建的RC
roverliang@roverliangdeMac-mini study % kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 2m26s
查看Pod
的占用情况
roverliang@roverliangdeMac-mini study % kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-64b64df8c9-x6gzz 1/1 Running 0 17h
mysql-frrfx 1/1 Running 0 3m35s
启动 Mysql SVC 服务
创建一个与之关联的Kubernetes Service-MySQL 的定义文件(文件名为mysql-svc.yaml)。完整的内容和解释如下:
apiVersion: v1
kind: Service #表明是Kubernetes Service
metadata:
name: mysql #Service 全局唯一名称
spec:
ports:
- port: 3306 #Service提供的服务端口号
selector:
app: mysql #Service 对应的Pod。拥有这里对应的标签.
运行kubectl 命令,创建 Service
roverliang@roverliangdeMac-mini study % kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.107.208.178 <none> 8080:30011/TCP 17h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
mysql ClusterIP 10.109.89.147 <none> 3306/TCP 5m15s
MySQL服务被分配了一个值为10.109.89.147的Cluster IP
地址。随后,Kubernetes集群中其他新创建的Pod就可以通过Service
的Cluster IP+端口号3306
来连接和访问它了。”
通常,Cluster IP
是在Service
创建后由Kubernetes
系统自动分配的,其他Pod无法预先知道某个Service
的Cluster IP
地址,因此需要一个服务发现机制来找到这个服务。
为此,最初时,Kubernetes
巧妙地使用了Linux环境变量(Environment Variable)
来解决这个问题,后面会详细说明其机制。现在只需知道,根据Service的唯一名称,容器可以从环境变量
中获取Service对应的Cluster IP地址和端口,从而发起TCP/IP连接请求。
启动Tomcat 应用
- 创建
myweb-rc.yaml
配置文件
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5
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'
- 创建
myweb-rc
roverliang@roverliangdeMac-mini study % kubectl create -f myweb-rc.yaml
replicationcontroller/myweb created
- 获取创建的myweb pod
# 创建中
roverliang@roverliangdeMac-mini study % kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-64b64df8c9-x6gzz 1/1 Running 0 17h
mysql-frrfx 1/1 Running 0 19m
myweb-49scc 0/1 ContainerCreating 0 26s
myweb-54brv 0/1 ContainerCreating 0 26s
myweb-9jv2z 0/1 ContainerCreating 0 26s
myweb-jcjpz 0/1 ContainerCreating 0 26s
myweb-t5hc6 0/1 ContainerCreating 0 26s
# 创建完成
roverliang@roverliangdeMac-mini study % kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-64b64df8c9-x6gzz 1/1 Running 0 18h
mysql-frrfx 1/1 Running 0 25m
myweb-49scc 1/1 Running 0 6m5s
myweb-54brv 1/1 Running 0 6m5s
myweb-9jv2z 1/1 Running 0 6m5s
myweb-jcjpz 1/1 Running 0 6m5s
myweb-t5hc6 1/1 Running 0 6m5s
- 创建myweb-svc 服务
创建myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
创建svc 服务
roverliang@roverliangdeMac-mini study % kubectl create -f myweb-svc.yaml
service/myweb created
查看Service
roverliang@roverliangdeMac-mini study % kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.107.208.178 <none> 8080:30011/TCP 18h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18h
mysql ClusterIP 10.109.89.147 <none> 3306/TCP 43m
myweb NodePort 10.100.49.129 <none> 8080:30001/TCP 63s
经过上面的几个步骤,我们终于成功实现了Kubernetes上第1个例子的部署搭建工作。现在一起来见证成果吧!在你的笔记本上打开浏览器,输入
http://127.0.0.1:30001/demo/
。
比如虚拟机IP为192.168.18.131(可以通过#ip a命令进行查询),在浏览器里输入地址http://127.0.0.1:30001/demo/后
,可以看到如图1.2所示的网页界面。