欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

k8s安装

程序员文章站 2024-03-11 16:49:31
...

配置节点hosts文件

[[email protected] ~]# vi /etc/hosts
192.168.1.11 k8smaster
192.168.1.12 k8snode1
192.168.1.14 k8snode2

安装最新版本docker-ce

# 安装指定版本的docker(目前最新的1.14.0版本的kubenetes依赖的docker可以为1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09):
# 如果版本不符合可以先卸载,再安装
[[email protected] ~]# yum -y remove docker*
[[email protected] ~]# rm -rf /var/lib/docker

# 阿里源开始安装
[[email protected] ~]# vi /etc/yum.repos.d/Ali-docker.repo
[ali.yun.com-docker]
name=aliyun
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=0
[[email protected] ~]# yum install -y docker-ce
[[email protected] ~]# systemctl enable docker.service && systemctl start docker.service

安装最新版本k8s

[[email protected] ~]# vi /etc/yum.repos.d/Ali-k8s.repo
[ali.yun.com-k8s]
name=aliyunk8s
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
[[email protected] ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
[[email protected] ~]# systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet

升级内核

# 安装之前需要先安装perl
[[email protected] ~]#  yum install perl -y
# ELRepo 仓库(可以先看一下 /etc/yum.repos.d/ 中是否有yum 源)
[[email protected] ~]#  rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[[email protected] ~]#  rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

# 查看可用内核
[[email protected] ~]#  yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 查看所有内核
[[email protected] ~]#  yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates

# 安装最新内核
[[email protected] ~]#  yum --enablerepo=elrepo-kernel install kernel-ml

# 查看可用内核,一般上面安装的序号为0
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

# 设置默认内核为最新的
[[email protected] ~]#  grub2-set-default 0

# 生成 grub 配置文件
[[email protected] ~]#  grub2-mkconfig -o /boot/grub2/grub.cfg

# 重启
[[email protected] ~]#  reboot

# 验证
uname -a

确保主机的唯一性

# 查看mac地址确认
cat /sys/class/net/ens33/address

# 查看确认UUID
cat /sys/class/dmi/id/product_uuid

关闭防火墙

[[email protected] ~]# systemctl disable firewalld.service && systemctl stop firewalld.service 

配置网桥的流量

# 加载模块
# 方法一
[[email protected] ~]# lsmod | grep br_netfilter  
# 方法二
[[email protected] ~]# modprobe br_netfilter 	//centos7需要敲一下,否则报错
# 配置各节点系统内核参数使流过网桥的流量也进入iptables/netfilter框架中
[[email protected] ~]# vi /etc/sysctl.conf 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1
[[email protected] ~]# sysctl -p

关闭selinux

[[email protected] ~]# vi /etc/selinux/config
SELINUX=disabled

关闭swap

# K8s 1.8版本之后要求必须关闭
[[email protected] ~]# swapoff -a
[[email protected] ~]# cp /etc/fstab /etc/fstab_bak
[[email protected] ~]# vi /etc/fstab		//删除swap
[[email protected] ~]# vi /etc/sysctl.conf 
vm.swappiness = 0
[[email protected] ~]# sysctl -p

# 查看swap被关闭,全为0
[[email protected] ~]# free -m

创建docker配置目录和docker守护线程配置文件要修改

[[email protected] ~]# mkdir /etc/docker
[[email protected] ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
[[email protected] ~]# systemctl daemon-reload && systemctl enable docker && systemctl restart docker

当使用docker时,kubeadm 会自动检测 kubelet 使用的cgroup driver ,并将运行时设置到 /var/lib/kubelet/kubeadm-flags.env 文件中,如果使用不同的CRI(容器运行时),就需要编辑 /etc/default/kubelet(该文件需要手动创建)指定cgroup-driver的值:node节点也需要修改

[[email protected] ~]# vi /etc/default/kubelet
Environment=
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
# 由于 kubelet 默认的驱动就是cgroupfs,所以只有CRI的cgroup driver不是cgroupfs时才需要指定(k8s推荐docker的cgroup driver配置为systemd)

启动kubernets

[[email protected] ~]# systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet

拉取核心组件镜像(*不稳定可能需要多拉几次):

[[email protected] ~]# kubeadm config images pull

# 无法下载的话,需要看看需要下载的镜像:原因就是国内无法访问k8s.gcr.io
# 版本的查看
[[email protected] ~]# kubeadm version 
[[email protected] ~]# kubeadm config images list --kubernetes-version=v1.14.1
k8s.gcr.io/kube-apiserver:v1.14.1
k8s.gcr.io/kube-controller-manager:v1.14.1
k8s.gcr.io/kube-scheduler:v1.14.1
k8s.gcr.io/kube-proxy:v1.14.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

# 然后从docker的google的克隆镜像拉取,完事后更换tag:
docker pull mirrorgooglecontainers/kube-apiserver:v1.14.1
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.1
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.1
docker pull mirrorgooglecontainers/kube-proxy:v1.14.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1

# 也可以使用方便的脚本
[[email protected] ~]# kubeadm config images list --kubernetes-version=v1.14.1 |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x
# coredns这个镜像不在google的克隆镜像站中,需要单独下载:
[[email protected] ~]# docker pull coredns/coredns:1.3.1

# 方法一:就该就是一个一个的重新做tag,然后删除旧镜像。
# 重新打上google的tag
[[email protected] ~]# docker tag mirrorgooglecontainers/kube-apiserver:v1.13.0 k8s.gcr.io/kube-apiserver:v1.13.0
# 删除旧镜像
[[email protected] ~]# docker rmi mirrorgooglecontainers/kube-apiserver:v1.13.0

# 方法二:批量修改
[[email protected] ~]# docker images |grep mirrorgooglecontainers | awk '{print "docker tag ",$1":"$2,$1":"$2}' | sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2' | sh -x
# 批量删除旧
[[email protected] ~]# docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x
# coredns仍然需要但需修改
[[email protected] ~]# docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
[[email protected] ~]# docker rmi coredns/coredns:1.3.1 

Master 节点

至少2核4G内存
默认没有flanneld网络,Node节点间的pod不能通信,只能Node内通信,为了部署步骤简洁明了,故flanneld放在后面安装 flannel服务需要先于docker启动。flannel服务启动时主要做了以下几步的工作: 从etcd中获取network的配置信息 划分subnet,并在etcd中进行注册 将子网信息记录到/run/flannel/subnet.env中
所有节点及master上都要添加flannel:

# 拉取flannel镜像
[[email protected] ~]# docker pull quay.io/coreos/flannel:v0.10.0-amd64

[[email protected] ~]# mkdir -p /etc/cni/net.d/

[[email protected] ~]# cat <<EOF> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
EOF

[[email protected] ~]# mkdir /usr/share/oci-umount/oci-umount.d -p
[[email protected] ~]# mkdir /run/flannel/

[[email protected] ~]# cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=172.100.0.0/16
FLANNEL_SUBNET=172.100.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF

[[email protected] ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
# 如果之前已经启动了kubele 的话,那么需要在root用户下敲(这个可以不用现在敲,启动k8s后才会生成)
[[email protected] ~]# mkdir -p $HOME/.kube 
[[email protected] ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
[[email protected] ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

当然如果已经是 root 用户安装的(我这边本地虚拟机就是以root用户执行的),可以执行:
[[email protected] ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

# 如果需要修改网络类型
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart kubelet
[[email protected] ~]# systemctl restart docker

# 检查网络
[[email protected] ~]# cat /run/flannel/subnet.env

利用 kubeadm init 一键完成Master节点的安装:

[[email protected] ~]# kubeadm init --apiserver-advertise-address 192.168.1.11 --pod-network-cidr=10.244.0.0/16
# 如果中间出现错误,重新初始化:
[[email protected] ~]# kubeadm reset
[[email protected] ~]# kubeadm init --apiserver-advertise-address 192.168.1.11 --pod-network-cidr=10.244.0.0/16

# 这里需要记录一下 kubeadm init 输出的 kubeadm join …… 命令,后面需要这个命令将各个节点加入集群中,先将它复制到其他地方备份,这玩意儿是真重要
[[email protected] ~]# kubeadm join 192.168.1.11:6443 --token x8q6av.yctsv9sunj2owl0c \
    --discovery-token-ca-cert-hash sha256:aacc10478759cfcc7f34cdd3d5ac47e798ae9a2e7ab51789ae2353e3a98a6254

客户端加入本集群

上述的令牌(已经加密,生命周期24小时)用于 master 和加入的 node 之间相互身份之间验证,凭借这个令牌可以让任何人将认证的节点加入到该集群,如果需要对令牌进行增、删、查的操作,可以使用 kubeadm token 命令,具体可参看kubeadm token。

[[email protected] ~]# kubeadm join 192.168.1.11:6443 --token x8q6av.yctsv9sunj2owl0c \
    --discovery-token-ca-cert-hash sha256:aacc10478759cfcc7f34cdd3d5ac47e798ae9a2e7ab51789ae2353e3a98a6254

根据它的提示,为了让 kubelet 为非root用户使用,需要作如下的一些配置:

[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 当然如果已经是 root 用户安装的(我这边本地虚拟机就是以root用户执行的),可以执行:
[[email protected] ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

查看集群状态:

[[email protected] ~]# kubectl get cs
NAME                			 STATUS    MESSAGE             ERROR
scheduler           		 	Healthy   	ok                  
controller-manager   	Healthy   	ok                  
etcd-0               			Healthy   	{"health":"true"}   

Pod 网络附加组件(重要)
 Pod 的网络组件很重要,这个组件主要作用是让 Pod 之间可以相互通信,该网络组件必须在任何应用部署之前进行部署,当然 CoreDNS 也只有在网络组件安装之后才能正常启动,kubeadm 仅仅支持基于网络(networks)的CNI(Container Network Interface),不支持 kubenet。有些项目提供了使用 CNI 的 k8s Pod,其中某些也支持网络协议。

POD网络不能与任何主机网络重叠,否则可能导致问题,如果发现网络插件的首选POD网络与某些主机网络发生冲突,应该考虑一个合适的CIDR替换,并在kubeadm init with–pod network cidr期间使用它,并将其作为网络插件yaml文件中的替换,根据上述集群初始化的输出提示,安装Pod的网路插件:

[[email protected] ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

每个集群中仅且可以安装一个Pod网络组件,可选网络组件有:Calico、Canal、Cilium、Flannel、Kube-router等等,这里选用 Kube-router,将桥接的IPv4流量传递到IPtables的链(重要),这样才能使得 CNI 正常工作,只要把/proc/sys/net/bridge/bridge-nf-call-iptables设置为1即可(在准备工作中已经做过):

[[email protected] ~]# sysctl net.bridge.bridge-nf-call-iptables=1

Kube-router 依赖于 kube-controller-manager 为节点分配 CIDR(无类别域间路由,Classless Inter-Domain Routing),因此初始化kubeadm init时带上–pod-network-cidr标识,其实上述初始化过程中我已经带上了该标识,验证一下:

[[email protected] ~]# kubectl get pods --all-namespaces

# 结果
NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE
kube-system   coredns-fb8b8dccf-gzs2k             1/1     Running   0          27h
kube-system   coredns-fb8b8dccf-hs56b             1/1     Running   0          27h
kube-system   etcd-k8smaster                     		 1/1     Running   1          27h
kube-system   kube-apiserver-k8smaster           	 1/1     Running   1          27h
kube-system   kube-controller-manager-k8smaster   1/1     Running   1          27h
kube-system   kube-flannel-ds-z7r6t               	1/1     Running   0          5h31m
kube-system   kube-proxy-75w9l                   		 1/1     Running   1          27h
kube-system   kube-scheduler-k8smaster            1/1     Running   1          27h

kubectl get pods --all-namespaces是通过检测 CoreDNS 是否运行来判断网络组件是否正常安装。

Node节点
5.1 向集群中添加 worker node 节点
至少4核16G内存

相关标签: k8s安装