世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活!

使用 yaml 文件编排创建 deployment 部署应用到 K8S 集群

2019-08-20
238次查阅
2019/8/20

Kubernetes 提供了一种更加简单的更新 RC 和 Pod 的机制,叫做 Deployment。通过在 Deployment 中描述你所期望的集群状态,Deployment Controller 会将现在的集群状态在一个可控的速度下逐步更新成你所期望的集群状态。

部署思路:①创建应用程序 → ②使用 Dockerfile 打包为镜像 → ③push 到镜像仓库 → ④使用 yaml 编排部署镜像到 k8s 集群。

k8s 集群部署:http://1987.name/1630.html

1、创建应用程序

作为测试,这里使用 python 编写一个简单的测试应用 test-http-server.py,服务端口为 8888:

vim test-http-server.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import socket
import json
from wsgiref.simple_server import make_server

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])

    hostname = socket.gethostname()
    hostip = socket.gethostbyname(hostname)

    data = {'HostName': hostname,
            'IP': hostip,
            'msg': 'this is a test server'}

    data = bytes(json.dumps(data), encoding="utf8")
    return [data]

httpd = make_server('', 8888, application)
print('Serving HTTP on port 8888...')
httpd.serve_forever()

2、使用 Dockerfile 打包为镜像

使用 Dockerfile 文件方式进行镜像打包操作:

cat Dockerfile

FROM python:3.7
WORKDIR /opt
COPY test-http-server.py /opt
EXPOSE 8888
ENTRYPOINT [ "/usr/bin/python3","/opt/test-http-server.py" ]

Dockerfile 创建好后,执行打包命令:

docker build -t registry.cn-hangzhou.aliyuncs.com/skml/k8s:v1 .

注:先要再阿里云容器镜像服务创建好命名空间和镜像仓库:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories,当然也可以是使用自建私有仓库:http://1987.name/1398.html

[root@k8s-master test]# docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
registry.cn-hangzhou.aliyuncs.com/skml/k8s   v1                  c5e3af1203c5        2 days ago          918MB
python                                       3.7                 e497dabd8450        4 days ago          918MB

将镜像推送至镜像仓库:

docker login -u=376765750@qq.com registry.cn-hangzhou.aliyuncs.com
docker push registry.cn-hangzhou.aliyuncs.com/skml/k8s:v1

3、创建 k8s Secret 资源

创建 Secret 是用来部署 pod 拉取镜像的认证,可以使用命令行方式或 yaml 方式。

方法一:命令行创建

kubectl create secret docker-registry my-registry \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=376765750@qq.com \
--docker-password=[******] \
--docker-email=sk@1987.name
-n=k8s                                                   # -n 是指定命名空间

方法二:使用编排文件

vim aliyun-docker-registry-secret.yaml

文件中{base64 -w 0 ~/.docker/config.json}需要替换为执行命令的结果,因为上面已经登录过镜像仓库,会生成 ~/.docker/config.json文件:

apiVersion: v1
kind: Secret
metadata:
  name: my-registry
  namespace: default
data:
  .dockerconfigjson: {base64 -w 0 ~/.docker/config.json}
type: kubernetes.io/dockerconfigjson

使用命令创建或删除:

kubectl create -f aliyun-docker-registry-secret.yaml     # 使用 yaml 文件创建资源

kubectl delete -f aliyun-docker-registry-secret.yaml     # 使用 yaml 文件删除资源
kubectl delete secrets my-registry                       # 使用命令删除
kubectl describe secret/my-registry                      # 查看详细信息

4、使用yaml文件创建Deployment

使用 yaml 文件编排 deployment 资源:

apiVersion: apps/v1beta2     # API 版本
kind: Deployment             # API 类型 {kubectl api-resources}

# 定义元数据
metadata:
  name: kube-node-test       # Deployment 资源名称
  namespace: default         # 命名空间
  labels:
    web: python              # Deployment 标签

# 控制器、pod、容器镜像配置
spec:
  replicas: 2                # 副本数,创建 2 个副本
  selector:                  # 选择器
    matchLabels:
      app: python-web        # 匹配 pod 的标签
  template:                  # 创建 pod
    metadata:                # pod 元数据
      labels:
        app: python-web      # pod 标签,和上面选择器标签要一致
    spec:
      containers:
        - name: python-web-1         # 容器名称
          image: registry.cn-hangzhou.aliyuncs.com/skml/k8s:v1     # 镜像地址
          ports:
            - protocol: TCP          # 协议
              containerPort: 8888    # 容器的端口,此端口只可以使用容器IP访问
      imagePullSecrets:
        - name: my-registry          # secret 资源名称,用于拉取镜像认证

创建 deployment 资源:

kubectl create -f test-deployment.yaml

创建之后查看创建的 pod:

[root@k8s-master ~]# kubectl get pods -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
kube-node-test-54cbf67578-54j6l   1/1     Running   0          22h   172.17.36.4   192.168.100.3   <none>           <none>
kube-node-test-54cbf67578-5nm2c   1/1     Running   0          22h   172.17.37.4   192.168.100.4   <none>           <none>

查看一个 pod 详细信息:

[root@k8s-master ~]# kubectl describe pods kube-node-test-54cbf67578-54j6l
Name:           kube-node-test-54cbf67578-54j6l
Namespace:      default
Priority:       0
Node:           192.168.100.3/192.168.100.3
Start Time:     Mon, 19 Aug 2019 11:04:28 +0800
Labels:         app=python-web
                pod-template-hash=54cbf67578
Annotations:    <none>
Status:         Running
IP:             172.17.36.4
Controlled By:  ReplicaSet/kube-node-test-54cbf67578
Containers:
  python-web-1:
    Container ID:   docker://3833e0618212aa202b1340d282f4d5c0df6919b2926f70f6a50395b6c57b45ac
    Image:          registry.cn-hangzhou.aliyuncs.com/skml/k8s:v1
    Image ID:       docker-pullable://registry.cn-hangzhou.aliyuncs.com/skml/k8s@sha256:4569fe9e82c5993a4df1bd5bc809171feb9ed26a011660adb54d4d1f1605241b
    Port:           8888/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Mon, 19 Aug 2019 11:07:14 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-dqwdc (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-dqwdc:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-dqwdc
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

现在可以使用 pod ip + port 来访问:

[root@k8s-node-1 ~]# curl 172.17.36.4:8888
{"HostName": "kube-node-test-54cbf67578-54j6l", "IP": "172.17.36.4", "msg": "this is a test server"}

至此配置完毕。

评论

想说点什么?