k8s安装
配置节点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内存