实战演练:玩转Kubernetes(1)

155 阅读4分钟

实战演练:玩转Kubernetes(1)

Kubernetes技术要点回顾

Kubernetes的Master/Node架构

image.png 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网站基本架构

image.png

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查看一下

image.png

envFrom可以一次性将ConfigMap中的所有字段全导进去Pod,并且通过prefix字段为导入的变量名添加前缀(即这里的MARIADB_)

创建maria-pod并查看

kubectl apply -f mariadb-pod.yml
kubectl get pod -o wide

image.png

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

image.png

3. 为wp-pod映射端口号

因为Pod都运行在Kubernetes内部的私有网段,外界无法直接访问,想要对外暴露服务,需要使用一个专门的 kubectl port-forward 命令,它专门负责把本机的端口映射到在目标对象的端口号,有点类似 Docker 的参数 -p,经常用于 Kubernetes 的临时调试和测试。

# 将本地的8080映射到wp-pod的80
kubectl port-forward wp-pod 8080:80 &

kubectl 会把这个端口的所有数据都转发给集群内部的 Pod

image.png

在命令的末尾我使用了一个 & 符号,让端口转发工作在后台进行,这样就不会阻碍我们后续的操作。

如果想关闭端口转发,需要敲命令 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 极客课程分享