Kubernetes 搭建好第一个简单实例
本人搭建环境初期使用的是该地址:可点击此处安装k8s集群环境后续再讲安装步骤启动MySQL服务首先为MySQL服务创建一个Deployment 定义文件mysql-deploy.yaml,下面给出该文件的对象:apiVersion: apps/v1# api版本kind: Deployment# 副本控制器Deploymentmetadata:labels:# 标签app: mysqlname:
本人搭建环境初期使用的是该地址:
可点击此处
安装k8s集群环境
后续再讲安装步骤
- 启动MySQL服务
首先为MySQL服务创建一个Deployment 定义文件mysql-deploy.yaml,下面给出该文件的对象:
apiVersion: apps/v1 # api版本
kind: Deployment # 副本控制器Deployment
metadata:
labels: # 标签
app: mysql
name: mysql # 对象名称,全局唯一
spec:
replicas: 1 # 预期的副本数量
selector:
matchLabels:
app: mysql
template: # Pod模版
metadata:
labels:
app: mysql
spec:
containers: #定义容器
- image: mysql:5.7
name: mysql
ports:
- containerPort: 3306 #容器应用监听的端口号
env: #注入容器内的环境变量
- name: MYSQL_ROOT_PASSWORD
value: "123456"
以上yaml 定义文件中的kind 属性用来表明此资源对象的类型,比如这里的属性值表示这是一个Deploment, spec 部分是Deployment的相关属性定义,比如spec.selector 是Deployment 的Pod选择器,符合条件的Pod实例受到该Deployment 的管理,确保在当前集群中始终有且仅有replicas 个 Pod实例在运行【这里设置replicas = 1 ,表示只能运行一个MySQL Pod 实例】,当在集群中运行的Pod 数量少于replicas 时,Deployment控制器会根据在spec.template 部分定义的Pod 模版生成一个新的Pod 实例,spec.template.metadata.labels 指定了该Pod 的标签,labels 必须匹配之前的spec.selector,
创建好mysql-deployment.yaml 文件后,为了将它发布到Kubernetes 集群中,我们在master上运行如下命令:
[root@k8s-master ~]# kubectl apply -f mysql-deploy.yaml
deployment.apps/mysql created
接下来,运行kubectl命令查看刚刚创建的Deployment:
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-9b877f47-hgnkt 0/1 ContainerCreating 0 8s
查看Pod的创建情况时,可以运行下面的命令:
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-9b877f47-hgnkt 1/1 Running 0 60s
可以看到一个名称为mysql-9b877f47-hgnkt 的Pod实例,这是Kubernetes 根据mysql 这个Deployment 的定义自动创建的Pod,由于的调度和创建需要花费一定的时间,比如需要确定调度到哪个节点上,而且下载Pod所需的容器镜像也需要一段时间,所有一开始Pod的状态为Pending,在Pod成功创建启动完成后,其状态最终会更新为Running.
我们可以在Kubernetes 节点的服务器上通过docker ps 指定查看正在运行的容器,发现提供MySQL服务的Pod容器已创建且正常运行,并且MySQL Pod 对应的容器多创建了一个Pause容器,该容器就是Pod的根容器
可以使用 describe 命令查看该pod 在哪个节点上
[root@k8s-master ~]# kubectl describe pod mysql-9b877f47-hgnkt
Name: mysql-9b877f47-hgnkt
Namespace: default
Priority: 0
Node: xxxxxxxx. 【此处就是该节点服务区】
...
到指定的节点服务器上运行
[root@k8s-node-2 ~]# docker ps | grep mysql
7b2899ac442f mysql "docker-entrypoint.s…" About a minute ago Up About a minute k8s_mysql_mysql-9b877f47-hgnkt_default_84079152-b9c5-482c-929f-ccdf32bd1799_0
20f23ff1f28a registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 2 minutes ago Up 2 minutes k8s_POD_mysql-9b877f47-hgnkt_default_84079152-b9c5-482c-929f-ccdf32bd1799_0
最后,创建一个与之关联的Kubernetes Service-----MySQL 的定义文件【文件名为mysql-svc.yaml】 ,完整的对象:
apiVersion: v1
kind: Service。 #表明是Kubernetes Service
metadata:
name: mysql #Service 的全局唯一名称
spec:
ports:
- port: 3306 # Service 提供服务的端口号
selector: # Service 对应的Pod 拥有这里定义的标签
app: mysql
其中,metadata.name 是Service 的服务名【serviceName】 ,spec.ports 属性定义了Service的虚端口,spec.selector 确定了哪些Pod 副本【实例】对应本服务,类似地,我们通过kubectl create命令创建Service对象:
[root@k8s-master ~]# kubectl create -f mysql-svc.yaml
service/mysql created
运行kubectl get 命令,查看刚刚创建的Service 对象:
[root@k8s-master ~]# kubectl get svc mysql
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql ClusterIP 10.1.214.99 <none> 3306/TCP 12s
可以发现,MySQL 服务被分配了一个值为10.1.214.99 的ClusterIP 地址【在不同环境中分配的IP地址可能不同】,随后,在Kuberetes 集群中新创建的其他Pod就可以通过Service 的ClusterIP+端口3306 来连接和访问它了。
通常,CLusterIP 地址是在Service 创建后由Kubernetes系统自动分配的,其他Pod 无法预先知道某个Service 的ClusterIP 地址,因此需要一个服务发现机制来找到这个服务。为此Kubernetes 最初巧妙地使用了Linux 环境变量来解决这个问题,根据Service 的唯一名称,容器可以从环境变量中获取Service 对应的ClusterIP 地址和端口号,从而发起TCP/IP连接请求。
2.启动Toncat 应用
创建对应的myweb-deploy.yaml,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: myweb
name: myweb
spec:
replicas: 2
selector:
matchLabels:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- image: kubeguide/tomcat-app:v1
name: myweb
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 10.1.214.99
注意:tomcat 容器内,应用将使用环境变量MYSQL_SERVICE_HOST 的值连接MySQL服务,但是这里为什么没有注册该环境变量呢? 这是因为kubernetes 会自动将已存在的Service对象以环境变量的形式展现在新生成的Pod中,其更安全,可靠的方法是使用服务的名称mysql,这就要求集群内的DNS服务【kube-dns】正常运行,运行如下命令:
[root@k8s-master ~]# kubectl apply -f myweb-deploy.yaml
deployment.apps/myweb created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-9b877f47-hgnkt 1/1 Running 0 85m
myweb-6c96767c98-l94zd 1/1 Running 0 14m
myweb-6c96767c98-pq5jn 1/1 Running 0 14m
最后,创建对应的Service ,以下是【myweb-svc.yaml】
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
“type:NodePort” 和 “nodePort:30001” 表明此Service 开启了NodePort 格式的外网访问模式,比如,在Kubernetes集群外,客户端的浏览器可以通过30001 端口访问myweb【对应8080的虚端口】,运行kubectl create 命令进行创建:
[root@k8s-master ~]# kubectl create -f myweb-svc.yaml
service/myweb created
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 20d
mysql ClusterIP 10.1.214.99 <none> 3306/TCP 68m
myweb NodePort 10.1.204.189 <none> 8080:30001/TCP 8s
至此第一个案例已完成
- 浏览器访问网页
点击案例
可访问如下网页,点击添加可加入数据到mysql 中
进入到mysql pod 对象的node 服务器上 可查看mysql数据信息;
[root@k8s-node-2 ~]# docker ps | grep mysql
7b2899ac442f mysql "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_mysql_mysql-9b877f47-hgnkt_default_84079152-b9c5-482c-929f-ccdf32bd1799_0
20f23ff1f28a registry.aliyuncs.com/google_containers/pause:3.6 "/pause" 2 hours ago Up 2 hours k8s_POD_mysql-9b877f47-hgnkt_default_84079152-b9c5-482c-929f-ccdf32bd1799_0
#通过此命令进入到mysql容器中 7b2899ac442f为mysql运行id
[root@k8s-node-2 ~]# docker exec -it 7b2899ac442f /bin/bash
#进入容器后 登陆mysql 命令行
root@mysql-9b877f47-hgnkt:/# mysql -uroot -p
#此处不做说明
这个地方编码不对【不做修改】
至此第一个案例演示完成
更多推荐
所有评论(0)