linux运维、架构之路-Kubernetes离线、二进制部署集群
一、Kubernetes对应Docker的版本支持列表
Kubernetes 1.9 <--Docker 1.11.2 to 1.13.1 and 17.03.x
Kubernetes 1.8 <--Docker 1.11.2 to 1.13.1 and 17.03.x
Kubernetes 1.7 <--Docker 1.10.3, 1.11.2, 1.12.6
Kubernetes 1.6 <--Docker 1.10.3, 1.11.2, 1.12.6
Kubernetes 1.5 <--Docker 1.10.3, 1.11.2, 1.12.3
版本对应地址:
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.5.md#external-dependency-version-information
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.6.md#external-dependency-version-information
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.7.md#external-dependency-version-information
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#external-dependencies
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md#external-dependencies
二、Kubernetes集群部署架构图

三、Kubernetes集群环境规划
1、系统环境
[root@k8s-master ~]# cat /etc/redhat-release
CentOS Linux release 7.2. (Core)
[root@k8s-master ~]# uname -r
3.10.-.el7.x86_64
[root@k8s-master ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
[root@k8s-master ~]# getenforce
Disabled
2、服务器规划
|
节点及功能 |
主机名 |
IP |
|
Master、etcd、registry |
K8s-master |
10.0.0.211 |
|
Node1 |
K8s-node-1 |
10.0.0.212 |
|
Node2 |
K8s-node-2 |
10.0.0.213 |
3、统一hosts解析
echo '
10.0.0.211 k8s-master
10.0.0.211 etcd
10.0.0.211 registry
10.0.0.212 k8s-node-
10.0.0.213 k8s-node-' >> /etc/hosts
4、下载Kubernetes(简称K8S)二进制文件
https://github.com/kubernetes/kubernetes/releases


此处用的k8s版本为v:1.8.3
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v183
Docker版本为v17.03-ce

etcd下载版本为v3.1.18
https://github.com/coreos/etcd/releases/
四、Kubernetes集群离线部署
1、部署docker
#上传docker离线包#
yum install docker-ce-selinux-17.03..ce-.el7.centos.noarch.rpm docker-ce-17.03..ce-.el7.centos.x86_64.rpm -y
#移除旧版本#
yum remove docker \
docker-common \
docker-selinux \
docker-engine
设置docker服务开机启动
systemctl enable docker.service
systemctl start docker.service
修改docker的镜像源为国内的daocloud
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://a58c8480.m.daocloud.io
2、部署etcd3
CentOS7二进制安装组件注意事项:
①复制对应的二进制文件到/usr/bin目录下
②创建systemd service启动服务文件
③创建service 中对应的配置参数文件
④将该应用加入到开机自启
#上传etcd-v3.1.18-linux-amd64.tar.gz#
tar xf etcd-v3.1.18-linux-amd64.tar.gz
cd etcd-v3.1.18-linux-amd64/
mv etcd etcdctl /usr/bin/
①创建/etc/etcd/etcd.conf配置文件
mkdir /etc/etcd/ -p
mkdir /var/lib/etcd -p [root@k8s-master ~]# cat /etc/etcd/etcd.conf
ETCD_NAME=ETCD Server
ETCD_DATA_DIR="/var/lib/etcd/"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.211:2379"
②创建etcd.service启动服务文件
[root@k8s-master ~]# cat /etc/systemd/system/etcd.service
[Unit]
Description=etcd.service
[Service]
Type=notify
TimeoutStartSec=
Restart=always
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd
[Install]
WantedBy=multi-user.target
说明:其中WorkingDirectory为etcd数据库目录,前面我们已经提前创建好了
③设置etcd开机启动
systemctl daemon-reload
systemctl enable etcd.service
systemctl start etcd.service
④检验etcd是否安装成功
[root@k8s-master ~]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.211:2379
cluster is healthy
3、部署k8s-Master节点组件
#上传kubernetes-server-linux-amd64.tar.gz#
tar xf kubernetes-server-linux-amd64.tar.gz
mkdir -p /app/kubernetes/{bin,cfg}
mv kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl} /app/kubernetes/bin
①配置kube-apiserver.service服务
配置文件:vim /app/kubernetes/cfg/kube-apiserver
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Etcd服务地址
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.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=10.0.0.211"
# 允许容器请求特权模式,默认false
KUBE_ALLOW_PRIV="--allow-privileged=false"
# 集群分配的IP范围
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.10.10.0/24"
启动服务systemd:vim /lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/app/kubernetes/cfg/kube-apiserver
#ExecStart=/app/kubernetes/bin/kube-apiserver ${KUBE_APISERVER_OPTS}
ExecStart=/app/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
启动服务,并设置开机自启
systemctl daemon-reload
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
②配置kube-scheduler服务
配置文件:
vim /app/kubernetes/cfg/kube-scheduler
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=10.0.0.211:8080"
KUBE_LEADER_ELECT="--leader-elect"
systemd服务文件:
vim /lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/app/kubernetes/cfg/kube-scheduler
ExecStart=/app/kubernetes/bin/kube-scheduler \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_MASTER} \
${KUBE_LEADER_ELECT}
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务并设置开机启动
systemctl daemon-reload
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service
③配置kube-controller-manger
配置文件:
cat /app/kubernetes/cfg/kube-controller-manager
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=10.0.0.211:8080"
systemd服务文件
cat /lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/app/kubernetes/cfg/kube-controller-manager
ExecStart=/app/kubernetes/bin/kube-controller-manager \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_MASTER} \
${KUBE_LEADER_ELECT}
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务并设置开机自启
systemctl daemon-reload
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
至此Master节点组件就全部启动了,需要注意的是服务启动顺序有依赖,先启动etcd,再启动apiserver,其他组件无顺序要求
查看Master节点组件运行进程
[root@k8s-master ~]# ps -ef|grep kube
root : ? :: /app/kubernetes/bin/kube-apiserver --logtostderr=true --v= --etcd-servers=http://10.0.0.211:2379 --insecure-bind-address=0.0.0.0 --insecure-port=8080 --advertise-address=10.0.0.211 --allow-privileged=false --service-cluster-ip-range=10.10.10.0/24
root : ? :: /app/kubernetes/bin/kube-scheduler --logtostderr=true --v= --master=10.0.0.211: --leader-elect
root : ? :: /app/kubernetes/bin/kube-controller-manager --logtostderr=true --v= --master=10.0.0.211:
root : pts/ :: grep --color=auto kube
验证Master节点功能
[root@k8s-master ~]# kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
etcd- Healthy {"health": "true"}
controller-manager Healthy ok
scheduler Healthy ok
如果启动失败,查看日志
[root@k8s-master ~]# journalctl -u kube-apiserver.service
-- Logs begin at 一 -- :: CST, end at 一 -- :: CST. --
9月 :: k8s-master systemd[]: Started Kubernetes API Server.
9月 :: k8s-master systemd[]: Starting Kubernetes API Server...
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924400 flags.go:] FLAG: --addre
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924847 flags.go:] FLAG: --admis
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924866 flags.go:] FLAG: --admis
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924873 flags.go:] FLAG: --adver
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924878 flags.go:] FLAG: --allow
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924884 flags.go:] FLAG: --alsol
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924904 flags.go:] FLAG: --anony
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924908 flags.go:] FLAG: --apise
9月 :: k8s-master kube-apiserver[]: I0903 ::00.924914 flags.go:] FLAG: --audit
配置环境变量
echo "export PATH=$PATH:/app/kubernetes/bin" >> /etc/profile
source /etc/profile
4、部署K8s-Node节点组件
#上传kubernetes-node-linux-amd64.tar.gz#
tar xf kubernetes-node-linux-amd64.tar.gz
mkdir -p /app/kubernetes/{bin,cfg}
mv kubernetes/node/bin/{kubelet,kube-proxy} /app/kubernetes/bin/
①配置kubelet服务
创建kubeconfig配置文件:kubeconfig文件用于kubelet连接master apiserver
cat /app/kubernetes/cfg/kubelet.kubeconfig
apiVersion: v1
kind: Config
clusters:
- cluster:
server: http://10.0.0.211:8080
name: local
contexts:
- context:
cluster: local
name: local
current-context: local
创建kubelet配置文件
cat /app/kubernetes/cfg/kubelet
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Kubelet服务IP地址
NODE_ADDRESS="--address=10.0.0.212"
# Kubelet服务端口
NODE_PORT="--port=10250"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override=10.0.0.212"
# kubeconfig路径,指定连接API服务器
KUBELET_KUBECONFIG="--kubeconfig=/app/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服务文件
cat /lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=-/app/kubernetes/cfg/kubelet
ExecStart=/app/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
启动服务并设置开机自启
systemctl daemon-reload
systemctl enable kubelet.service
systemctl start kubelet.service
②配置kube-proxy服务
配置文件
mkdir /app/kubernetes/cfg/ -p cat /app/kubernetes/cfg/kube-proxy
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override=10.0.0.212"
# API服务地址
KUBE_MASTER="--master=http://10.0.0.211:8080"
systemd服务文件
cat /lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/app/kubernetes/cfg/kube-proxy
ExecStart=/app/kubernetes/bin/kube-proxy \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${NODE_HOSTNAME} \
${KUBE_MASTER}
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务并设置开机自启
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
③部署Flannel网络
下载安装
wget https://github.com/coreos/flannel/releases/download/v0.9.1/flannel-v0.9.1-linux-amd64.tar.gz
tar xf flannel-v0.9.1-linux-amd64.tar.gz
cp flanneld mk-docker-opts.sh /usr/bin/
mkdir -p /app/flannel/conf/
配置内核转发
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables =
net.bridge.bridge-nf-call-iptables =
vm.swappiness=
EOF sysctl --system
systemd服务文件
cat /usr/lib/systemd/system/flanneld.service [Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service [Service]
Type=notify
EnvironmentFile=/app/flannel/conf/flanneld
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/flanneld-start $FLANNEL_OPTIONS
ExecStartPost=/usr/libexec/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure [Install]
WantedBy=multi-user.target
WantedBy=docker.service
配置文件:master、node都需要执行
cat /app/flannel/conf/flanneld # Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.211:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_KEY="/k8s/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
FLANNEL_OPTIONS="--logtostderr=false --log_dir=/var/log/k8s/flannel/ --etcd-endpoints=http://10.0.0.211:2379"
启动服务并设置开机自启
Master执行:
etcdctl set /k8s/network/config '{ "Network": "172.16.0.0/16" }'
systemctl daemon-reload
systemctl enable flanneld.service
systemctl start flanneld.service
验证服务:
journalctl -u flanneld |grep 'Lease acquired'
9月 :: k8s-node- flanneld[]: I0903 ::02.862074 manager.go:] Lease acquired: 10.0.11.0/
9月 :: k8s-node- flanneld[]: I0903 ::47.882891 manager.go:] Lease acquire: 10.0.11.0/
④启动Flannel之后,需要依次重启docker、kubernete
Master节点执行:
systemctl restart docker.service
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service
Node节点执行:
systemctl restart docker.service
systemctl restart kubelet.service
systemctl restart kube-proxy.service
Master节点查看IP信息

Node节点查看IP信息

小结:查看docker0和flannel0的网络设备,确保每个Node上的Docker0和flannel0在同一段内,并且不同节点的网段都被划分在172.16.0.0/16 的不同段内。如Master是172.16.88.0/16,Node1是172.16.65.0/16……
linux运维、架构之路-Kubernetes离线、二进制部署集群的更多相关文章
- [转贴]CentOS7.5 Kubernetes V1.13(最新版)二进制部署集群
CentOS7.5 Kubernetes V1.13(最新版)二进制部署集群 http://blog.51cto.com/10880347/2326146 一.概述 kubernetes 1.13 ...
- linux运维架构师职业规划
1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...
- linux运维、架构之路-Kubernetes离线集群部署-无坑
一.部署环境介绍 1.服务器规划 系统 IP地址 主机名 CPU 内存 CentOS 7.5 192.168.56.11 k8s-node1 2C 2G CentOS 7.5 192.168.56 ...
- Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)
官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...
- Kubernetes V1.15 二进制部署集群
1. 架构篇 1.1 kubernetes 架构说明 1.2 Flannel网络架构图 1.3 Kubernetes工作流程 2. 组件介绍 2.1 ...
- 转:linux运维工程师
运维中关键技术点解剖:1 大量高并发网站的设计方案:2 高可靠.高可伸缩性网络架构设计:3 网站安全问题,如何避免被黑?4 南北互联问题,动态CDN解决方案:5 海量数据存储架构 一.什么是大型网站运 ...
- 面试 Linux 运维工作至少需要知道哪些知识?
前言 我们已经发过不少 Linux 面试题,但是单独的面试题总感觉会过于零碎,没有体系化内容给人的帮助大. 知乎上有这样一个问题:一个新手面试 Linux 运维工作至少需要知道哪些知识?其中有一个答案 ...
- linux运维文章
运维中关键技术点解剖:1 大量高并发网站的设计方案 :2 高可靠.高可伸缩性网络架构设计:3 网站安全问题,如何避免被黑?4 南北互联问题,动态CDN解决方案:5 海量数据存储架构 一.什么是大型网站 ...
- linux运维面试前,先来检查这些基础知识忘了没?
知乎上有这样一个问题:一个新手面试 Linux 运维工作至少需要知道哪些知识?其中有一个答案对这一话题的解读非常深入,今天特别分享给大家. 一.什么是大型网站运维? 首先明确一下,全文所讲的”运维“是 ...
随机推荐
- Unity UI —Text
Character Text 文本字体的编辑 Font Style 字体格式可以自行下载也可在windows自带字体中查找 Font Size 字体尺寸 Line Spacing 行距 Rich Te ...
- Matlab——表达式 阵列与矩阵的创建
表达式 指令过长: 如果一个指令过长可以在结尾加上... 下一行继续写指令即可 若不想每次都显示运算结果,只需在运算式最後加上分号(:)即可 注释 基本的算术运算有: 加 (+).减 (-).乘 (* ...
- spark MLlib矩阵四则运算,线性代数
1.导包请看我的上一篇博文,maven项目的包 https://www.cnblogs.com/wuzaipei/p/10965680.html 2.denseMatirx 矩阵四则运算如下 版本不同 ...
- Java基础/时间日期格式
Java时间日期格式转换 一.Date转String和String转Date 参考博客:https://www.cnblogs.com/sharpest/p/7879377.html public s ...
- 又是图论.jpg
BZOJ 2200 道路和航线重讲ww: FJ 正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到 T 个城镇 (1 ≤ T ≤ 25000),编号为 1 到 T.这些城镇之间通过 R 条 ...
- [Codeforces 1246B] Power Products (STL+分解质因数)
[Codeforces 1246B] Power Products (STL+分解质因数) 题面 给出一个长度为\(n\)的序列\(a_i\)和常数k,求有多少个数对\((i,j)\)满足\(a_i ...
- Intellij IDEA关闭 Build窗口提示
如果开启了Tomcat的话,我们在idea中代码有错误,并且在切换软件的时候,Idea会不断提示编译错误(Build错误),这个会很烦人.我们可以先将Tomcat关掉,就不会一直弹出Build窗口了.
- 06: django+celery+redis
目录: 1.1 Celery介绍 1.2 celery 组件 1.3 安装相关包 与 管理命令 1.4 celery与Django执行异步任务 1.5 在django中使用计划任务功能 1.1 Cel ...
- Python 入门之数据类型之间的相互转换 以及 在编程中会遇到的数据类型的坑
Python 入门之数据类型之间的相互转换 以及 在编程中会遇到的数据类型的坑 1.数据类型总结: 可变,不可变,有序,无序 (1)可变的数据类型:list dict set (2)不可变的数据类型: ...
- kmeans 聚类 k 值优化
kmeans 中k值一直是个令人头疼的问题,这里提出几种优化策略. 手肘法 核心思想 1. 肉眼评价聚类好坏是看每类样本是否紧凑,称之为聚合程度: 2. 类别数越大,样本划分越精细,聚合程度越高,当类 ...