部署镜像到kubernetes

概述

我们已经在rancher中添加了kubernetes集群,本文档主要记录如何使用rancher在k8s集群中部署镜像,其中包括构建镜像、使用镜像以及服务升级等过程,本文以部署自定义的python环境镜像pyenv-code:3.6-buster为示例。
项目示例整体包括两个部分:

  • 准备工作:
    • 项目镜像准备:
    • rancher环境准备:
  • 操作:
    • 部署镜像
    • 服务升级

工具/技术

类别 内容
运行环境 Docker
容器编排技术 Kubernetes
K8S可视化管理工具 Rancher
镜像仓库 Nexus

准备

项目镜像准备

构建镜像并上传

镜像基于标准python镜像python:3.6-buster,安装了常用的vim,openssl等工具,设置root密码为asd123,并默认启动ssh。

  • Dockerfile模板
  1. FROM python:3.6-buster
  2. RUN echo >/etc/apt/sources.list "\n\
  3. deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free\n\
  4. deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free\n\
  5. deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free\n\
  6. deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free\n\
  7. " &&\
  8. pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple &&\
  9. apt update && apt install -y sudo vim openssh-server openssh-client &&\
  10. mkdir -p /var/run/sshd &&\
  11. echo 'root:asd123' | chpasswd &&\
  12. sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config &&\
  13. sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd &&\
  14. echo "export VISIBLE=now" >> /etc/profile
  15. LABEL author="gpp" email="guopanpan@sinosoft.com.cn"
  16. EXPOSE 22
  17. CMD /usr/sbin/sshd && /bin/bash
  • 构建命令
    在docker环境下执行以下命令进行构建
  1. # Dockerfile 一般放在构建镜像的根目录下
  2. [rancher@node~] ls
  3. Dockerfile
  4. # 构建命令,构建时如果没有定义镜像版本,则默认为最新版本
  5. [rancher@node~] docker build -t pyenv-code:3.6-buster .
  6. Successfully built ce89da84997f
  7. Successfully tagged pyenv-code:3.6-buster
  8. # 定义镜像私有仓库版本,并上传
  9. [rancher@node~] docker tag pyenv-code:3.6-buster $(registry-address)/pyenv-code:3.6-buster
  10. [rancher@node~] docker push $(registry-address)/pyenv-code:3.6-buster

rancher环境准备

1. 创建项目/命名空间

在容器编排可视化管理rancher中,创建项目和命名空间
创建项目,我们需要部署的服务都可以在这个项目里进行相关操作
在rancher中,选择k8s集群,点击项目/命名空间,添加项目。
image.png
在创建的项目中自定义命名空间,命名空间存放的实体只在本命名空间域内有效,在此命名空间外部无效,可解决命名冲突问题。
image.png

2. 配置私有仓库

参考《私有仓库使用教程》

操作

部署镜像

进入提前创建的项目,部署服务。
填写服务名称,设置服务镜像及版本(如果未设置版本号,则版本号默认为latest),选择命名空间;

image.png

端口映射

k8s的网络映射模式主要分为三类:NodePort、HostPort、集群IP,前两种是真实存在的,而集群IP是虚拟出来的,仅用于Service资源。

  • 集群IP:Pod启动完成后,会虚拟出一个集群IP,只在集群内部可达的私网地址,可以被各pod访问以及节点本身可访问,集群外部无法访问。访问模式:集群IP:容器端口
  • NodePort: 通过节点端口映射使得集群外部可达,是在ClusterIP基础上添加一层节点端口映射,默认开放的端口区间为30000~32767,设置映射时,可选择随机生成,也可在区间内自定义。访问模式为:集群内任意节点IP:映射端口
  • HostPort:映射容器内端口到所在宿主机上,映射端口可自定义设置。访问模式:pod所在宿主机IP:映射端口

image.png
根据情况选择端口映射类型,若只需要实现pod间互相通信,建议使用集群IP,若需要同一网段集群外部访问,建议选择Nodeport,非特殊情况下不建议选用HostPort

数据卷

k8s数据卷挂载方式有很多种,主要使用volumePersistentVolume、以及Projected Volume三种模式。

1. Volume

volume模式以emptyDir类型为代表

  • 在Pod里创建容器时可以直接生成具有类型为emptyDir的Volume,即使Container终止并重新启动,该Volume也会在Pod的整个生命周期内持续存在。
    注意: emptyDir类型卷的生命周期与pod同步,当pod升级或者重新部署时,数据卷数据会被清空。

image.png

2. PersistentVolume

PersistentVolume(PV)是集群中的一块存储,由管理员提供或使用存储类动态提供。PV属于群集资源,它的生命周期与使用PV的任何单个Pod无关。
k8s支持的PersistentVolume模式有很多,eg: NFSshareHostPath以及分布式块存储系统Longhorn

当用户想要使用PV时,他们首先创建持久化声明(PVC)清单,指定所需要的最低容量要求,和访问模式,然后通过PVC声明PV,PVC是对PV资源的请求和使用,而Pod通过PVC来使用PV。
最后在pod里使用PVC进行挂载。

PVC消耗PV资源,一个PV对应一个PVC使用,当PVC被删除释放出来后,PV才能被下一个PVC使用。

  • 管理员在集群中安装并分配了存储类longhorn,基于longhorn分配PV创建PVC
    使用longhorn创建PVC时,需注意,longhorn只支持单主机读写以及只能在一个pod内使用。

image.png

  • 使用HostPath,选择映射主机目录,指定主机目录挂载到容器目录内;
    为了安全起见,k8s集群所在客户端由管理员进行管理,非管理人员没有权限登录服务器。所以如果没有特殊需要,不建议直接分配宿主机资源使用HostPath

image.png

3. Projected Volume

我们也可以使用Projected Volume模式进行挂载,其中有SecretConfigMap两种类型。
使用SecretConfigMap都需要提前在pod所在的命名空间里创建。并且它们独立于pod,可以被多个pod使用。

Secret一般以键值的形式创建,用于pod中比较敏感的数据;ConfigMap可以是键值形式也可以是文件的形式。但是它们被挂载到容器内,都会以文件的形式存在。

  1. Secret
    • 先创建Secret

image.png

  • 在部署服务时使用Secret挂载
    服务启动后,secret里设定的key,value都会以文件的形式挂载到容器内。

image.png

  1. ConfigMap
    在rancher可视化中,ConfigMap可以加载文件,可以加载内容是key=value形式的文件,也可以直接编辑为键值形式,具体用法在这里不做过多说明,可参考Secret用法。

环境变量

在上面我们介绍了SecretConfigMap在挂载时的用法,那么,SecretConfigMap同样也适用于环境变量。
我们也可以直接以key/value形式添加。
image.png

其他设置

还有一些设置,包括主机调度,缩放/升级策略,资源限制等等,可以根据实际情况进行调整。
image.png

服务升级

如果服务发生变动,镜像版本更新,可选择升级服务修改镜像版本进行迭代。
image.png
每次升级,对其进行健康检查,查看部署情况
如果升级以后服务不稳定,可回滚到之前版本
image.png