环境平台规划
k8s里面之前我们了解过,主要的内容是master和node,所有这里可以划分为
- 单master集群
- 多master集群
单master集群
缺点:master挂掉后,便不能去管理node节点了
多master集群
与之前的区别便是多了master
服务器硬件要求
测试环境
master:cpu至少两核,内存4g以上,硬盘至少20g以上
node:cpu至少4核以上,内存8g+,硬盘40g+
生产环境
master:cpu至少8核,内存16g以上,硬盘至少100g以上
node:cpu至少16核以上,内存64g+,硬盘500g+
搭建方式
概述
常见的有两种方式
方式1,Kubeadm :
- Kubeadm 是一个 K8s 部署工具,
提供 kubeadm init 和 kubeadm join
,用于快速部署 Kubernetes 集群。 - 不需要我们再去做额外的处理,只需要使用上面的两个命令去见操作
- 官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
- Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查
方式2,二进制包,
- 从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。
- 如果想更容易可控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
下面便去搭建一个单master集群
方式一:kubeadm
了解
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- 创建一个 Master 节点
kubeadm init
- 将 Node 节点加入到当前集群中
$ kubeadm join <Master 节点的 IP 和端口 >
第一步:服务器环境(安装三台虚拟机)
要求
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止 swap 分区
详细的自己去百度
这三台虚拟机中,有两台作为node,另一台作为master
第二步:对虚拟机的环境初始化
三台机器都需要做下面的步骤
关闭防火墙
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux
# 关闭selinux# 永久
sed -i 's/enforcing/disabled/' /etc/selinux/config# 临时关闭
setenforce 0
关闭swap
# 关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
根据规划设置主机名
# 根据规划设置主机名
hostnamectl set-hostname <hostname>
设置主机名
hostnamectl set-hostname k8smaster
hostnamectl set-hostname k8snode1
hostnamectl set-hostname k8snode2
在master添加hosts
只是这种master的机器上设置
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.44.146 k8smaster
192.168.44.145 k8snode1
192.168.44.144 k8snode2
EOF
将桥接的IPv4流量传递到iptables的链
三个机器上都需要去设置
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
时间同步
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
第三步:所有节点安装Docker、kubeadm、kubelet
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
安装Docker
下载
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安装
$ yum -y install docker-ce-18.06.1.ce-3.el7
设置为开机自启
$ systemctl enable docker && systemctl start docker
查看docker的version
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
更换阿里云的docker仓库
$ cat > /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
查看是否更新成功
$ docker info
如果是下面的内容则证明修改成功
附:添加阿里云YUM软件源
方便后面去下载等
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
设置成开机启动
systemctl enable kubelet
第四步:部署Kubernetes Master
只是需要在192.168.31.61(Master节点上面)执行。
-
对master节点进行初始化操作,这时候docker便会去拉取对应的镜像
kubeadm init \--apiserver-advertise-address=192.168.44.146 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.18.0 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16
上面的命令执行完后,出现下面的信息则证明执行成功了
查看docker的镜像
-
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
-
使用kubectl工具:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看node节点
kubectl get nodes
第五步:将节点加入到master中
在之前master初始化后,会出现下面的内容,下面所使用的命令便是直接复制的这一段内容
在192.168.1.12/13(在Node节点上)执行。
-
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:
$ kubeadm join 192.168.1.11:6443 --token esce21.q6hetwm8si29qxwn \--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
-
上面的token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:
kubeadm token create --print-join-command
现在回到master服务器上,使用命令查看节点信息,可以发现节点已经完成了添加,现在这些节点的状态不太对,所以还需要去配置一下网络
第六步:部署CNI网络插件
1、下载
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。
2、安装yum源
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
3、查看是否运行起来了
kubectl get pods -n kube-system
4、查看节点是否都成功运行了
第七步:测试kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
-
拉取nginx镜像
kubectl create deployment nginx --image=nginx
-
暴露端口,使通过网络可以去进行访问
kubectl expose deployment nginx --port=80 --type=NodePort
-
查看状态
$ kubectl get pod,svc
打开浏览器,进行访问
方式二:二进制方式搭建k8s集群
第一步:选择服务器(两台虚拟机)
要求
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止 swap 分区
在这里选择了两台虚拟机,一台作为master,一台作为node
第二步:初始化服务器(两台虚拟机初始化)
关闭防火墙
临时关闭防火墙
systemctl stop firewalld
永久关闭防火墙
systemctl disable firewalld
关闭 selinux
永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
临时关闭
setenforce 0
关闭 swap
临时关闭
swapoff -a
永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
根据规划设置主机名
hostnamectl set-hostname <hostname>
在 master 添加 hosts
cat >> /etc/hosts << EOF
192.168.44.147 m1
192.168.44.148 n1
EOF
将桥接的 IPv4 流量传递到 iptables 的链
先执行下面的命令
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
然后进行生效生效
sysctl --system
时间同步
先进行进行安装
yum install ntpdate -y
然后进行时间同步
ntpdate time.windows.com
第三步:为etcd和apiserver生成自签证书
准备 cfssl 证书生成工具
cfssl 是一个开源的证书管理工具,使用 json 文件生成证书,相比 openssl 更方便使用。
找任意一台服务器操作,这里用 Master 节点
-
首先,依次执行下面的命令,将对应的包下载并移动到对应的目录
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64mv cfssl_linux-amd64 /usr/local/bin/cfsslmv cfssljson_linux-amd64 /usr/local/bin/cfssljsonmv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
-
进入上面移动到的目录下面,查看文件
-
执行脚本,查看执行后的情况
-
查看下面的脚本文件内容,可以发现两行内容,第一行的内容便是对证书进行初始化操作
-
初始化证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
-
初始化操作结束后,会生成两个文件,查看这两个文件
ls *pem
-
查看json文件
cat server-csr.json
-
修改上面hosts里面的ip,改为当前的网络ip
-
执行之前脚本里面的第二行内容
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
查看进行结果
-
查看server相关的内容
ls server*
如下,这些便是最终生成的证书文件
第四步:部署etcd集群
-
从 Github 下载二进制文件
下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz -
将下载的tar.gz解压,并查看其解压的内容
将etcd.service这个文件复制到system里面cp etcd.service /usr/lib/systemd/system/
-
将ssl目录下面的证书替换为之前生成的证书
删除ssl目录下面的内容
将之前生成的证书文件复制过来cp /root.TLS/etcd/{ca.server,server-key}.pem ssl/
-
查看etcd的配置文件,并修改目录里面的etcd.conf配置文件
修改为如下的ip,现在只是两台
-
将当前etcd里面的内容发送到其他的服务器中去
scp -r etcd root@192.168.44.148:/opt/
进入发送到的服务器中,查看是否发送成功
证明发送成功了 -
将之前生成的其他文件也一起发送到node节点中
-
在其他节点中分别修改 etcd.conf 配置文件中的节点名称和当前服务器 IP
进行修改
-
在master节点上设置:启动并设置开机启动
重加载systemctl daemon-reload
执行
systemctl start etcd
设置开机启动
systemctl enable etcd
-
查看状态
master
node
第五步:为APIServer自签证书
有许多的node节点,及一个master节点,master节点的入口称为apiserver,在访问过程中,apiserver是通过https的方式进行访问的,所有需要对其做一个证书的自签,有下面的两种方式进行访问
- 添加可信赖的ip列表
- 发送请求时,携带ca证书进行发送
一些场景中不能携带,所以一般使用第一种方式
方式一实现的步骤:
-
进入下面的目录中
-
查看两个json文件内容
kube-proxy-csr.json
server-ccsr.json,这里面便展示了可信赖的ip列表
-
修改server-ccsr.json文件内容,添加可信赖的ip列表,上面的是修改过的
-
执行下面的sh文件
执行完后,便会生成自签证书(pen文件),如下:
第六步:部署master组件
在git上面现在对应的文件
下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183
注:打开链接你会发现里面有很多包,下载一个 server 包(如下)就够了,包含了 Master 和 Worker Node 二进制文件。
将下载的文件放到linux的root目录下,解压二进制包
解压结果
6.1 目录结构查看及配置文件的修改
进入kubernetes目录,查看里面的内容,
-
进入bin目录:可以发现里面全是可执行的文件
-
进入cfg,这里面全是组件的一些配置文件
-
查看剩下的目录内容,logs和ssl目录里面的内容都为空
-
将之前生成的证书文件复制到ssl目录下面
因为目前暂时不需要kube-proxy*文件,所以将这些都删除掉
-
查看配置文件
查看kube-apiserver.conf文件,这个文件里面的内容需要修改
查看kube-controller-manager.conf文件,这个文件里面的内容不需要去修改
查看kube-sheduler.conf配置文件,这个文件也不需要去进行修改
查看kube-apiserver.conf文件,该文件内容说明:
注:上面两个\ \ 第一个是转义符,第二个是换行符,使用转义符是为了使用 EOF 保留换行符。
- –logtostderr:启用日志
- —v:日志等级
- –log-dir:日志目录
- –etcd-servers:etcd 集群地址
- –bind-address:监听地址
- –secure-port:https 安全端口
- –advertise-address:集群通告地址
- –allow-privileged:启用授权
- –service-cluster-ip-range:Service 虚拟 IP 地址段
- –enable-admission-plugins:准入控制模块
- –authorization-mode:认证授权,启用 RBAC 授权和节点自管理
- –enable-bootstrap-token-auth:启用 TLS bootstrap 机制
- –token-auth-file:bootstrap token 文件
- –service-node-port-range:Service nodeport 类型默认分配端口范围
- –kubelet-client-xxx:apiserver 访问 kubelet 客户端证书
- –tls-xxx-file:apiserver https 证书
- –etcd-xxxfile:连接 Etcd 集群证书
- –audit-log-xxx:审计日志
修改 kube-apiserver.conf文件的内容步骤:更换配置文件的ip地址
-
位置1
-
位置2
-
位置3
最后保存退出
6.2 启动并设置开机启动
在启动前面,先做下面的步骤:
- 将之前的kubernetes目录放到opt目录下面
- 将剩余的service文件放到system目录里面去,变为可执行文件
- 将kubectl这个目录放到system这个目录里面去
最后,依次执行下面的三行命令:
systemctl daemon-reload
systemctl start kube-apiserver
systemctl enable kube-apiserver
- 启动,并查看进程,便发现启动成功了
- 剩下的两个命令也是一样的操作
- 设置开机启动
for i in ${ls /opt/kubernetes/bin};do systemctl enable $i;done
现在可以进入logs目录查看日志信息
下面便是启动信息
现在便可以在~目录下,直接使用kubectl命令了,如下
6.3 授权 kubelet-bootstrap 用户允许请求证
直接执行下面的这段命令即可
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
第七步:部署node组件
下面的操作都是在node节点下进行的
7.1 docker安装
docker下载地址:https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
安装步骤:
-
解压压二进制包
tar zxvf docker-19.03.9.tgz
-
移动目录
将docker这个文件移动到usr的bin目录下mv docker/* /usr/bin/
将docker.service移动到system目录下
mv docker.service /usr/lib/systemd/system
将daemon.json文件放到etc目录下的docker文件夹里面
mkdir /etc/docker mv daemon.json /etc/docker/
-
修改配置文件的内容,设置为阿里云镜像
{"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] }
-
启动并设置开机启动
systemctl daemon-reload
启动
systemctl start docker
开机启动
systemctl enable docker
7.2 kubelet、kube-proxy
解压之前下载的kubernetes-node-linux-amd64.tar.gz包,后面会有这些文件
执行步骤:
-
解压并移动对应的文件
将service可执行文件移动到system目录下面
将kubernetes移动到opt目录下去
-
修改kubernetes里面的配置文件
修改bootstrap.kubeconfig文件里面
将配置文件里面的ip修改为当前master节点的ip
修改kub-proxy.conf配置文件内容
将配置文件里面的ip修改为当前master节点的ip
修改kubelet.conf配置文件
修改主机名称为当前node节点的主机名称n1
修改kubelet.proxy-config.yml文件
修改主机名称为当前node节点的主机名称n1
-
查看是否还要遗漏的ip没有修改
可以发现,都已经修改了
-
在当前node节点中添加自签证书,这个自签证书从之前在master节点的中去获取
查看master节点中自签证书
上面的自签证书是从master节点中的另一个目录复制过来的,这里我们进入之前生成自签证书的原目录去
将node节点对应的自签证书复制到node节点的服务器中
查看是否发送到node节点中
-
启动kubelet并设置开机启动
重启systemctl daemon-reload
启动
systemctl start kubelet
设置开机启动
systemctl enable kubelet
-
启动kube-proxy并设置开机启动
重启systemctl daemon-reload
启动
systemctl start kube-proxy
设置开机启动
systemctl enable kube-proxy
-
批准 kubelet 证书申请并加入集群
在master节点查看授权请求,会发现这里有一个授权请求kubectl get csr
对这个授权请求进行批准,后面的名字是上面查看授权请求的NAMEkubectl certificate approve node-csr-xxx
在master节点查看节点,我们便发现之前的node节点已经被添加进去了
kubectl get c
这里由于网络插件还没有部署,节点会没有准备就绪 NotReady
第七步:部署CNI集群网络
首先准备好 CNI 二进制文件:
下载地址:
https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tg
这个链接好像过期了,各位到时候自己在网上找吧
下面的操作都在node节点下进行
操作步骤如下:
-
创建bin和net.d目录
mkdir /opt/cni/bin /etc/cin/net.d -p
-
进入cni目录
-
将解压cni内容移动到之前的cni目录下
tar cni-xxx -C /opt/cni/bin/
在上面的bin目录下查看解压后的内容
现在开始在master节点进行操作
-
下载文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
-
执行该文件
kubectl apply -f kube-flannel.yml
-
查看状态
kubectl get pods -n kube-system
查看node节点状态,现在node节点便成为了准备的状态了
第八步:测试kubernetes集群
首先,下载nginx镜像
kubectl create deployment nginx --image=nginx
其次,对外暴露一个端口
kubectl expose deployment nginx --port=80 --type=NodePort
然后,查看
kubectl get pod,svc
最后,在浏览器使用任意一个node节点的ip便可以去访问了