k8s安装

配置节点hosts文件

[root@localhost ~]# 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):
# 如果版本不符合可以先卸载,再安装
[root@localhost ~]# yum -y remove docker*
[root@localhost ~]# rm -rf /var/lib/docker

# 阿里源开始安装
[root@localhost ~]# 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
[root@localhost ~]# yum install -y docker-ce
[root@localhost ~]# systemctl enable docker.service && systemctl start docker.service

安装最新版本k8s

[root@localhost ~]# 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
[root@localhost ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
[root@localhost ~]# systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet

升级内核

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

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

# 安装最新内核,
[root@localhost ~]#  yum --enablerepo=elrepo-kernel install kernel-ml  

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

# 设置默认内核为最新的
[root@localhost ~]#  grub2-set-default 0

# 生成 grub 配置文件
[root@localhost ~]#  grub2-mkconfig -o /boot/grub2/grub.cfg

# 重启
[root@localhost ~]#  reboot

# 验证
uname -a

确保主机的唯一性

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

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

关闭防火墙

[root@localhost ~]# systemctl disable firewalld.service && systemctl stop firewalld.service 

配置网桥的流量

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

关闭selinux

[root@localhost ~]# vi /etc/selinux/config
SELINUX=disabled

关闭swap

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

# 查看swap被关闭,全为0
[root@localhost ~]# free -m

启动kubernets

[root@localhost ~]# systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet

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

[root@localhost ~]# kubeadm config images pull

# 无法下载的话,需要看看需要下载的镜像:原因就是国内无法访问k8s.gcr.io
# 版本的查看
[root@localhost ~]# kubeadm version 
[root@localhost ~]# 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的克隆镜像拉取,也可以从 registry.cn-hangzhou.aliyuncs.com/google_containers/去拉镜像,完事后更换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

# 也可以使用方便的脚本
[root@localhost ~]# 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的克隆镜像站中,需要单独下载:
[root@localhost ~]# docker pull coredns/coredns:1.3.1

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

# 方法二:批量修改
[root@localhost ~]# docker images |grep mirrorgooglecontainers | awk '{print "docker tag ",$1":"$2,$1":"$2}' | sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2' | sh -x
# 批量删除旧
[root@localhost ~]# docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x
# coredns仍然需要但需修改
[root@localhost ~]# docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
[root@localhost ~]# 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:
也可以使用calico网络:
https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

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

[root@localhost ~]# mkdir -p /etc/cni/net.d/

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

[root@localhost ~]# mkdir /usr/share/oci-umount/oci-umount.d -p
[root@localhost ~]# mkdir /run/flannel/

[root@localhost ~]# 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


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

# 检查网络
[root@localhost ~]# cat /run/flannel/subnet.env

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

[root@localhost ~]# kubeadm init --apiserver-advertise-address 192.168.1.10 --pod-network-cidr=10.244.0.0/16
# 如果中间出现错误,重新初始化:
[root@localhost ~]# kubeadm reset
[root@localhost ~]# kubeadm init --apiserver-advertise-address 192.168.1.11 --pod-network-cidr=10.244.0.0/16
如果cpu报错的话加上 --ignore-preflight-errors=NumCPU
![修改cgroups报错](https://img- blog.csdnimg.cn/20190924154442318.png)
[root@localhost ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
# 如果之前已经启动了kubele 的话,那么需要在root用户下敲(这个可以不用现在敲,启动k8s后才会生成)
[root@localhost ~]# mkdir -p $HOME/.kube 
[root@localhost ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
[root@localhost ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

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

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

#添加自动补全:
echo “source <(kubectl completion bash)” >> ~/.bashrc
客户端加入本集群

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

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

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

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

查看集群状态:

[root@localhost ~]# 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的网路插件:

[root@localhost ~]# 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即可(在准备工作中已经做过):

[root@localhost ~]# sysctl net.bridge.bridge-nf-call-iptables=1

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

[root@localhost ~]# 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内存


版权声明:本文为qq_43773421原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。