Kubernetes(K8S)集群管理Docker容器(部署篇)

简介:

一、架构拓扑图

53e0a846f89d2cdcd6b194b90e852f76.png

二、环境规划

角色

IP

组件

master

192.168.0.211

etcd

kube-apiserver

kube-controller-manager

kube-scheduler

node01

192.168.0.212

kubelet

kube-proxy

docker

node02

192.168.0.213

kubelet

kube-proxy

docker

环境说明:

操作系统:Ubuntu16.04 or CentOS7

Kubernetes版本:v1.8.3

Docker版本:v17.09-ce

均采用当前最新稳定版本。

关闭selinux。

三、部署集群

3.1 下载二进制包

打开下面网址,下载下面两个红色框框的包。

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v183

 1e610818c915f4f97dafc14a19aa94fc.png

27ff88ecd5201140479dda9b02033c83.png

下载完成后,上传到服务器:

kubernetes-server-linux-amd64.tar.gz上传到master节点。

kubernetes-node-linux-amd64.tar.gz 上传到node节点。

3.2  安装etcd3

1
2
3
4
5
6
7
8
k8s-master # yum install etcd –y
k8s-master # vi /etc/etcd/etcd.conf 
ETCD_NAME= "default"
ETCD_DATA_DIR= "/var/lib/etcd/default"
ETCD_LISTEN_CLIENT_URLS= "http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS=http: //0 .0.0.0:2379
k8s-master # systemctl enable etcd
k8s-master # systemctl start etcd


注意:Ubuntu系统etcd配置文件在/etc/default/etcd。

3.3 运行Master节点组件

1
2
3
k8s-master # tar zxvf kubernetes-server-linux-amd64.tar.gz
k8s-master # mkdir -p /opt/kubernetes/{bin,cfg}
k8s-master # mv kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl} /opt/kubernetes/bin

3.3.1 apiserver

创建配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# vi /opt/kubernetes/cfg/kube-apiserver
# 启用日志标准错误
KUBE_LOGTOSTDERR= "--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL= "--v=4"
# Etcd服务地址
KUBE_ETCD_SERVERS= "--etcd-servers=http://192.168.0.211:2379"
# API服务监听地址
KUBE_API_ADDRESS= "--insecure-bind-address=0.0.0.0"
# API服务监听端口
KUBE_API_PORT= "--insecure-port=8080"
# 对集群中成员提供API服务地址
KUBE_ADVERTISE_ADDR= "--advertise-address=192.168.0.211"
# 允许容器请求特权模式,默认false
KUBE_ALLOW_PRIV= "--allow-privileged=false"
# 集群分配的IP范围
KUBE_SERVICE_ADDRESSES= "--service-cluster-ip-range=10.10.10.0/24"

创建systemd服务文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# vi /lib/systemd/system/kube-apiserver.service 
[Unit]
Description=Kubernetes API Server
Documentation=https: //github .com /kubernetes/kubernetes
[Service]
EnvironmentFile=- /opt/kubernetes/cfg/kube-apiserver
#ExecStart=/opt/kubernetes/bin/kube-apiserver ${KUBE_APISERVER_OPTS}
ExecStart= /opt/kubernetes/bin/kube-apiserver  \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_ETCD_SERVERS} \
${KUBE_API_ADDRESS} \
${KUBE_API_PORT} \
${KUBE_ADVERTISE_ADDR} \
${KUBE_ALLOW_PRIV} \
${KUBE_SERVICE_ADDRESSES}
Restart=on-failure
[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

1
2
3
# systemctl daemon-reload
# systemctl enable kube-apiserver
# systemctl restart kube-apiserver

注意:apiserver默认支持etcd3,如果是etcd2,需启动时指定版本选项--storage-backend=etcd2

3.3.2 scheduler

创建配置文件:

1
2
3
4
5
# vi /opt/kubernetes/cfg/kube-scheduler
KUBE_LOGTOSTDERR= "--logtostderr=true"
KUBE_LOG_LEVEL= "--v=4"
KUBE_MASTER= "--master=192.168.0.211:8080"
KUBE_LEADER_ELECT= "--leader-elect"

创建systemd服务文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# vi /lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https: //github .com /kubernetes/kubernetes
[Service]
EnvironmentFile=- /opt/kubernetes/cfg/kube-scheduler
ExecStart= /opt/kubernetes/bin/kube-scheduler  \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_MASTER} \
${KUBE_LEADER_ELECT}
Restart=on-failure
[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

1
2
3
# systemctl daemon-reload
# systemctl enable kube-scheduler
# systemctl restart kube-scheduler

3.3.3 controller-manager

创建配置文件:

1
2
3
4
# vi /opt/kubernetes/cfg/kube-controller-manager
KUBE_LOGTOSTDERR= "--logtostderr=true"
KUBE_LOG_LEVEL= "--v=4"
KUBE_MASTER= "--master=192.168.0.211:8080"

创建systemd服务文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# vi /lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https: //github .com /kubernetes/kubernetes
[Service]
EnvironmentFile=- /opt/kubernetes/cfg/kube-controller-manager
ExecStart= /opt/kubernetes/bin/kube-controller-manager  \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_MASTER} \
${KUBE_LEADER_ELECT}
Restart=on-failure
[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

1
2
3
# systemctl daemon-reload
# systemctl enable kube-controller-manager
# systemctl restart kube-controller-manager

3.3.4 小结

Master节点组件就全部启动了,需要注意的是服务启动顺序有依赖,先启动etcd,再启动apiserver,其他组件无顺序要求。

查看Master节点组件进程状态:

0fd14ce58c9dfe66a4802e64e02aff8b.png

说明组件都在运行。

如果启动失败,请查看启动日志,例如:

#journalctl -u kube-apiserver

3.4  运行Node节点组件

1
2
3
k8s-node01 # tar zxvf kubernetes-node-linux-amd64.tar.gz
k8s-node01 # mkdir -p /opt/kubernetes/{bin,cfg}
k8s-node01 # mv kubernetes/node/bin/{kubelet,kube-proxy} /opt/kubernetes/bin/

3.4.1 kubelet

创建kubeconfig配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
# vi /opt/kubernetes/cfg/kubelet.kubeconfig
apiVersion: v1
kind: Config
clusters:
   - cluster:
       server: http: //192 .168.0.211:8080
     name:  local
contexts:
   - context:
       cluster:  local
     name:  local
current-context:  local

kubeconfig文件用于kubelet连接master apiserver。

创建配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# vi /opt/kubernetes/cfg/kubelet            
# 启用日志标准错误
KUBE_LOGTOSTDERR= "--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL= "--v=4"
# Kubelet服务IP地址
NODE_ADDRESS= "--address=192.168.0.212"
# Kubelet服务端口
NODE_PORT= "--port=10250"
# 自定义节点名称
NODE_HOSTNAME= "--hostname-override=192.168.0.212"
# kubeconfig路径,指定连接API服务器
KUBELET_KUBECONFIG= "--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig"
# 允许容器请求特权模式,默认false
KUBE_ALLOW_PRIV= "--allow-privileged=false"
# DNS信息
KUBELET_DNS_IP= "--cluster-dns=10.10.10.2"
KUBELET_DNS_DOMAIN= "--cluster-domain=cluster.local"
# 禁用使用Swap
KUBELET_SWAP= "--fail-swap-on=false"

创建systemd服务文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# vi /lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=- /opt/kubernetes/cfg/kubelet
ExecStart= /opt/kubernetes/bin/kubelet  \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${NODE_ADDRESS} \
${NODE_PORT} \
${NODE_HOSTNAME} \
${KUBELET_KUBECONFIG} \
${KUBE_ALLOW_PRIV} \
${KUBELET_DNS_IP} \
${KUBELET_DNS_DOMAIN} \
${KUBELET_SWAP}
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

1
2
3
# systemctl daemon-reload
# systemctl enable kubelet
# systemctl restart kubelet

3.4.2 proxy

创建配置文件:

1
2
3
4
5
6
7
8
9
# vi /opt/kubernetes/cfg/kube-proxy            
# 启用日志标准错误
KUBE_LOGTOSTDERR= "--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL= "--v=4"
# 自定义节点名称
NODE_HOSTNAME= "--hostname-override=192.168.0.212"
# API服务地址
KUBE_MASTER= "--master=http://192.168.0.211:8080"

创建systemd服务文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# vi /lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=- /opt/kubernetes/cfg/kube-proxy
ExecStart= /opt/kubernetes/bin/kube-proxy  \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${NODE_HOSTNAME} \
${KUBE_MASTER}
Restart=on-failure
[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

1
2
3
# systemctl daemon-reload
# systemctl enable kube-proxy
# systemctl restart kube-proxy

3.4.3 小结

其他节点加入集群与node01方式相同,但需修改kubelet的--address和--hostname-override选项为本机IP。

查看Node节点组件进程状态:

02979dd7adf52d863fbaaf356a421cdf.png

说明组件都在运行。

如果启动失败,请查看启动日志,例如:

#journalctl -u kubelet

3.5 验证集群是否部署成功

设置可执行文件到系统变量,方便使用:

1
2
# echo "export PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile
# source /etc/profile

查看集群节点状态:

a0ff4d58486157275e9adf01a26d5f72.png

两个节点都加入到了kubernetes集群,就此部署完成。



本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1983392,如需转载请自行联系原作者

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1138 109
|
7月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2172 10
|
7月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
655 115
|
7月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
760 2
|
Kubernetes 开发者 微服务
简化Kubernetes应用部署工具-Helm之Hook
本文讲的是简化Kubernetes应用部署工具-Helm之Hook【编者的话】微服务和容器化给复杂应用部署与管理带来了极大的挑战。Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。
2790 0
|
6月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
555 1
|
6月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
370 89
|
11月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
725 9

相关产品

  • 容器服务Kubernetes版