实战演练:玩转Kubernetes(1)
Kubernetes技术要点回顾
Kubernetes的Master/Node架构
Kubernetes把集群中的计算资源定义为节点(Node),其中又划分为控制面和数据面两类。
- 控制面,Master节点,负责管理集群和运维监控应用,核心组件是:apiserver、etcd、scheduler、controller-manager。
- 数据面,Worker节点,受Master管控,核心组件是:kubelet、kube-proxy、container-runtime。
YAML语言
YAML 是 JSON 的超集,但语法更简洁,表现能力更强,更重要的是它以“声明式”来表述对象的状态,不涉及具体的操作细节,这样 Kubernetes 就能够依靠存储在 etcd 里集群的状态信息,不断地“调控”对象,直至实际状态与期望状态相同,这个过程就是 Kubernetes 的自动化运维管理
Pod对象
Pod捆绑了一组存在密切协作关系的容器,容器之间共享网络和存储,在集群里必须一起调度一起运行。
Kubernetes管理的基本单位是Pod。
Job/CronJob对象
对应的是离线作业,逐层包装了 Pod,添加了作业控制和定时规则
ConfigMap/Secret对象
对应的是配置信息,需要以环境变量或者存储卷的形式注入进 Pod,然后进程才能在运行时使用
kubectl
kubectl是Kubernetes提供的一个客户端工具,直接与Master节点的apiserver通信。
kubectl 的命令很多,查看自带文档可以用 api-resources、explain ,查看对象状态可以用 get、describe、logs ,操作对象可以用 run、apply、exec、delete 等等
WordPress的Kubernetes搭建实战
WordPress网站基本架构
1. 编排Maria对象
定义环境变量
定义一个maria-cm对象
apiVersion: v1
kind: ConfigMap
metadata:
name: maria-cm
data:
DATABASE: 'db'
USER: 'wp'
PASSWORD: '123'
ROOT_PASSWORD: '123'
定义maria-pod对象
定义一个maria-pod对象,并将配置信息注入Pod
apiVersion: v1
kind: Pod
metadata:
name: maria-pod
labels:
app: wordpress
role: database
spec:
containers:
- image: mariadb:10
name: maria
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
envFrom:
- prefix: 'MARIADB_'
configMapRef:
name: maria-cm
这里使用了envFrom字段,我们可以使用kubectl explain查看一下
envFrom可以一次性将ConfigMap中的所有字段全导进去Pod,并且通过prefix字段为导入的变量名添加前缀(即这里的MARIADB_)
创建maria-pod并查看
kubectl apply -f mariadb-pod.yml
kubectl get pod -o wide
2. 编排WordPress对象
定义环境变量
apiVersion: v1
kind: ConfigMap
metadata:
name: wp-cm
data:
HOST: '172.17.0.7'
USER: 'wp'
PASSWORD: '123'
NAME: 'db'
定义wp-pod对象
apiVersion: v1
kind: Pod
metadata:
name: wp-pod
labels:
app: wordpress
role: website
spec:
containers:
- image: wordpress:5
name: wp-pod
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
envFrom:
- prefix: 'WORDPRESS_DB_'
configMapRef:
name: wp-cm
创建wp-pod并查看
kubectl apply -f wp-pod.yml
kubectl get pod -o wide
3. 为wp-pod映射端口号
因为Pod都运行在Kubernetes内部的私有网段,外界无法直接访问,想要对外暴露服务,需要使用一个专门的 kubectl port-forward 命令,它专门负责把本机的端口映射到在目标对象的端口号,有点类似 Docker 的参数 -p,经常用于 Kubernetes 的临时调试和测试。
# 将本地的8080映射到wp-pod的80
kubectl port-forward wp-pod 8080:80 &
kubectl 会把这个端口的所有数据都转发给集群内部的 Pod
在命令的末尾我使用了一个 & 符号,让端口转发工作在后台进行,这样就不会阻碍我们后续的操作。
如果想关闭端口转发,需要敲命令 fg ,它会把后台的任务带回到前台,然后就可以简单地用“Ctrl + C”来停止转发了。
4. 创建反向代理Nginx
配置ngnix
server {
listen 80;
default_type text/html;
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
}
docker run -v 加载配置文件启动nginx
docker run -d --rm \
--net=host \
-v /tmp/proxy.conf:/etc/nginx/conf.d/default.conf \
nginx:alpine
验证服务
打开浏览器,输入本机的“127.0.0.1”或者是虚拟机的 IP 地址(192.168.56.102),看到 WordPress 的界面:
使用Dashboard管理Kubernetes
执行命令
kubectl proxy --port=8888 --address='192.168.56.102' --accept-hosts='^.*' & minikube dashboard
点击任意一个 Pod 的名字,就会进入管理界面,可以看到 Pod 的详细信息,而右上角有 4 个很重要的功能,分别可以查看日志、进入 Pod 内部、编辑 Pod 和删除 Pod,相当于执行 logs、exec、edit、delete 命令,但要比命令行要直观友好的多
总结
思维导图
《极客时间-Kubernetes入门实战课》学习笔记 Day15