部署镜像到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模板
FROM python:3.6-buster
RUN echo >/etc/apt/sources.list "\n\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free\n\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free\n\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free\n\
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free\n\
" &&\
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple &&\
apt update && apt install -y sudo vim openssh-server openssh-client &&\
mkdir -p /var/run/sshd &&\
echo 'root:asd123' | chpasswd &&\
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config &&\
sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd &&\
echo "export VISIBLE=now" >> /etc/profile
LABEL author="gpp" email="guopanpan@sinosoft.com.cn"
EXPOSE 22
CMD /usr/sbin/sshd && /bin/bash
- 构建命令
在docker环境下执行以下命令进行构建
# Dockerfile 一般放在构建镜像的根目录下
[rancher@node~] ls
Dockerfile
# 构建命令,构建时如果没有定义镜像版本,则默认为最新版本
[rancher@node~] docker build -t pyenv-code:3.6-buster .
Successfully built ce89da84997f
Successfully tagged pyenv-code:3.6-buster
# 定义镜像私有仓库版本,并上传
[rancher@node~] docker tag pyenv-code:3.6-buster $(registry-address)/pyenv-code:3.6-buster
[rancher@node~] docker push $(registry-address)/pyenv-code:3.6-buster
rancher环境准备
1. 创建项目/命名空间
在容器编排可视化管理rancher中,创建项目和命名空间
创建项目,我们需要部署的服务都可以在这个项目里进行相关操作
在rancher中,选择k8s集群,点击项目/命名空间
,添加项目。
在创建的项目中自定义命名空间,命名空间存放的实体只在本命名空间域内有效,在此命名空间外部无效,可解决命名冲突问题。
2. 配置私有仓库
操作
部署镜像
进入提前创建的项目,部署服务。
填写服务名称,设置服务镜像及版本(如果未设置版本号,则版本号默认为latest),选择命名空间;
端口映射
k8s的网络映射模式主要分为三类:NodePort、HostPort、集群IP,前两种是真实存在的,而集群IP是虚拟出来的,仅用于Service资源。
- 集群IP:Pod启动完成后,会虚拟出一个集群IP,只在集群内部可达的私网地址,可以被各pod访问以及节点本身可访问,集群外部无法访问。访问模式:
集群IP:容器端口
。 - NodePort: 通过节点端口映射使得集群外部可达,是在ClusterIP基础上添加一层节点端口映射,默认开放的端口区间为
30000~32767
,设置映射时,可选择随机生成,也可在区间内自定义。访问模式为:集群内任意节点IP:映射端口
。 - HostPort:映射容器内端口到所在宿主机上,映射端口可自定义设置。访问模式:
pod所在宿主机IP:映射端口
根据情况选择端口映射类型,若只需要实现pod间互相通信,建议使用集群IP
,若需要同一网段集群外部访问,建议选择Nodeport
,非特殊情况下不建议选用HostPort
。
数据卷
k8s数据卷挂载方式有很多种,主要使用volume
、PersistentVolume
、以及Projected Volume
三种模式。
1. Volume
volume模式以emptyDir
类型为代表
- 在Pod里创建容器时可以直接生成具有类型为emptyDir的Volume,即使Container终止并重新启动,该Volume也会在Pod的整个生命周期内持续存在。
注意: emptyDir类型卷的生命周期与pod同步,当pod升级或者重新部署时,数据卷数据会被清空。
2. PersistentVolume
PersistentVolume(PV)是集群中的一块存储,由管理员提供或使用存储类动态提供。PV属于群集资源,它的生命周期与使用PV的任何单个Pod无关。
k8s支持的PersistentVolume
模式有很多,eg: NFSshare
、HostPath
以及分布式块存储系统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内使用。
- 使用
HostPath
,选择映射主机目录,指定主机目录挂载到容器目录内;
为了安全起见,k8s集群所在客户端由管理员进行管理,非管理人员没有权限登录服务器。所以如果没有特殊需要,不建议直接分配宿主机资源使用HostPath
。
3. Projected Volume
我们也可以使用Projected Volume
模式进行挂载,其中有Secret
和ConfigMap
两种类型。
使用Secret
和ConfigMap
都需要提前在pod所在的命名空间里创建。并且它们独立于pod,可以被多个pod使用。
Secret
一般以键值的形式创建,用于pod中比较敏感的数据;ConfigMap
可以是键值形式也可以是文件的形式。但是它们被挂载到容器内,都会以文件的形式存在。
- Secret
- 先创建Secret
- 在部署服务时使用Secret挂载
服务启动后,secret里设定的key,value都会以文件的形式挂载到容器内。
- ConfigMap
在rancher可视化中,ConfigMap可以加载文件,可以加载内容是key=value形式的文件,也可以直接编辑为键值形式,具体用法在这里不做过多说明,可参考Secret用法。
环境变量
在上面我们介绍了Secret
和ConfigMap
在挂载时的用法,那么,Secret
和ConfigMap
同样也适用于环境变量。
我们也可以直接以key/value形式添加。
其他设置
还有一些设置,包括主机调度,缩放/升级策略,资源限制等等,可以根据实际情况进行调整。
服务升级
如果服务发生变动,镜像版本更新,可选择升级服务修改镜像版本进行迭代。
每次升级,对其进行健康检查,查看部署情况
如果升级以后服务不稳定,可回滚到之前版本