安装部署k8s中,网上没有比较详细的部署步骤供小白参考实验,本文详细记录个人安装k8s过程步骤,在其过程中所遇见的坑,以及解决方案,以供小伙伴参考!!!
#设置主机名
[root@master ~]# vi /etc/hosts
192.168.50.139 master
192.168.50.140 node01
PS: master节点,node节点的主机名不要重复,有可能造成加入集群成功,但master节点执行kubectl get nodes无法获取node节点信息。
#关闭防火墙
[root@master ~]# systemctl stop firewalld
#设置防火墙开机不启动
[root@master ~]# systemctl disable firewalld
#查看防火墙状态
[root@master ~]# systemctl status firewalld
#临时关闭,用于关闭selinux防火墙,但重启后失效
[root@master ~]# setenforce 0
#关闭selinux,将SELINUX=enforcing修改为disabled
[root@master ~]# vi /etc/selinux/config
SELINUX=disabled
#重启系统
[root@master ~]# reboot
#查看selinux的状态
[root@master ~]# /usr/sbin/sestatus
SELinux status: disabled
#修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载,即注释/dev/mapper/centos-swap这行
[root@master ~]# vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Jan 21 19:19:41 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=214b916c-ad23-4762-b916-65b53fce1920 /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
#关闭swap,保证 kubelet正确运行
[root@master ~]# swapoff -a
#创建k8s.conf文件
[root@master ~]# vi /etc/sysctl.d/k8s.conf
#文件内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
#执行命令使修改生效
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
#保证在节点重启后能自动加载所需模块
[root@master ~]# cat > /etc/sysconfig/modules/ipvs.modules <
PS: 如果以上前提条件如果不满足,则即使kube-proxy的配置开启了ipvs模式,也会退回到iptables模式
[root@master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
#配置yum源路径,:
#阿里云的yum源(推荐)
[root@master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#docker的yum源(和上一个命令一样,配置yum源地址)
[root@master ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#查看可安装Docker版本
[root@master ~]# yum list docker-ce.x86_64 --showduplicates |sort -r
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 @docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable
docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
PS: Kubernetes 1.12已经针对Docker的1.11.1, 1.12.1, 1.13.1, 17.03, 17.06, 17.09, 18.06 等版本做了验证,需要注意Kubernetes 1.12最低支持的Docker版本是1.11.1。我们这里在各节点安装docker的18.06.1版本,如果需要安装其他版本,只需修改版本号即可
#建立元数据缓存
[root@master ~]# yum makecache fast
#安装docker,有时会因为网络问题下载有问题会报错,可以重复安装试试
[root@master ~]# yum install -y --setopt=obsoletes=0 docker-ce-18.06.1.ce-3.el7
#设置启动docker
[root@master ~]# systemctl start docker
#设置开机自启,否则kubeadm会报错,要求必须设置开机自启
[root@master ~]# systemctl enable docker
[root@master ~]# iptables -nvL
Chain INPUT (policy ACCEPT 9 packets, 760 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
#如果不是ACCEPT,则修改
[root@master ~]# iptables -P FORWARD ACCEPT
PS: Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信。但这里通过安装docker 1806,发现默认策略又改回了ACCEPT,这个不知道是从哪个版本改回的,因为我们线上版本使用的1706还是需要手动调整这个策略的。
#创建文件命令,这里用阿里云的,也可以用其他的
[root@master ~]# vi /etc/yum.repos.d/kubernetes.repo
#文件内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
enable=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
#建立元数据缓存并安装kubelet,kubeadm,kubectl
#不指定版本,则默认安装最新版本,目前为1.13版本,这里安装1.12版本
[root@master ~]# yum makecache fast && yum install -y kubelet-1.12.1 kubeadm-1.12.1 kubectl-1.12.1
PS:如果上述命令报错,可以拆开分别执行
#检查kubernetes.repo文件是否写错,gpgkey第二行没有空格有可能也会造成错误
#没有错误,仍然提示错误,则下载手动导入
#如果没有wget,则执行下面命令安装
[root@master ~]# yum install wget
#下载错误信息对应的gpgkey,这里以rpm-package-key.gpg为例
[root@master ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[root@master ~]# rpm --import rpm-package-key.gpg
#再次执行安装命令
PS: 如果不能科学上网,则需先将需要的镜像拉取到本地,否则初始化命令无法执行
#不清楚需要哪些镜像,则执行下列命令查看,默认显示最新版本,将对应的镜像版本修改以下即可,下列为v1.12.1
[root@master ~]# kubeadm config images list
I0122 13:54:06.772434 29672 version.go:89] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://storage.googleapis.com/kubernetes-release/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
I0122 13:54:06.772503 29672 version.go:94] falling back to the local client version: v1.12.1
k8s.gcr.io/kube-apiserver:v1.12.1
k8s.gcr.io/kube-controller-manager:v1.12.1
k8s.gcr.io/kube-scheduler:v1.12.1
k8s.gcr.io/kube-proxy:v1.12.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.2
#创建sh脚本
[root@master ~]# vi k8s.sh
#脚本内容
docker pull mirrorgooglecontainers/kube-apiserver:v1.12.1
docker pull mirrorgooglecontainers/kube-controller-manager:v1.12.1
docker pull mirrorgooglecontainers/kube-scheduler:v1.12.1
docker pull mirrorgooglecontainers/kube-proxy:v1.12.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.2.24
docker pull coredns/coredns:1.2.2
docker tag mirrorgooglecontainers/kube-apiserver:v1.12.1 k8s.gcr.io/kube-apiserver:v1.12.1
docker tag mirrorgooglecontainers/kube-controller-manager:v1.12.1 k8s.gcr.io/kube-controller-manager:v1.12.1
docker tag mirrorgooglecontainers/kube-scheduler:v1.12.1 k8s.gcr.io/kube-scheduler:v1.12.1
docker tag mirrorgooglecontainers/kube-proxy:v1.12.1 k8s.gcr.io/kube-proxy:v1.12.1
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag coredns/coredns:1.2.2 k8s.gcr.io/coredns:1.2.2
docker rmi mirrorgooglecontainers/kube-apiserver:v1.12.1
docker rmi mirrorgooglecontainers/kube-controller-manager:v1.12.1
docker rmi mirrorgooglecontainers/kube-scheduler:v1.12.1
docker rmi mirrorgooglecontainers/kube-proxy:v1.12.1
docker rmi mirrorgooglecontainers/pause:3.1
docker rmi mirrorgooglecontainers/etcd:3.2.24
docker rmi coredns/coredns:1.2.2
#运行脚本,下载所需镜像
[root@master ~]# bash k8s.sh
#查看本地镜像是否下载有我们所需镜像
[root@master ~]# docker image ls
PS: Kubernetes 1.8开始要求关闭系统的Swap,默认配置下kubelet将无法启动
#修改/etc/sysconfig/kubelet:
[root@master ~]# vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--fail-swap-on=false
#设置kubelet服务开机自启
[root@master ~]# systemctl enable kubelet.service
#初始化集群,版本和apiserver地址写自己对应的,Swap首字母大写,不然无效
[root@master ~]# kubeadm init \
--kubernetes-version=v1.12.1 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.50.139 \
--ignore-preflight-errors=Swap
#出现下列信息则表示成功,记录kubeadm join 命令,节点加入时候用到
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.50.139:6443 --token nvofhe.0cm44ebb9n18oolf --discovery-token-ca-cert-hash sha256:4e6d77ed6ee4c0be95117fd8576946aa03914985b77a773062dc3dcea0163702
#不管是管理员还是非管理员用户,最好都运行一下,不然关机重启系统之后可能有各种错误
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
#查看组件状态信息
[root@master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
#获取节点信息,现在的主节点状态为NotReady,原因是没有配置网络
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 8m31s v1.12.1
#安装的过程需要点时间,因为需要下载镜像
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
#下面的命令与上面作用一样都是安装Flannel
[root@master ~]# mkdir -p ~/k8s/
[root@master ~]# cd ~/k8s
#如果没有wget,需要执行下列命令安装
[root@master ~]# yum install wget
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@master ~]# kubectl apply -f kube-flannel.yml
PS: 安装命令获取地址:https://github.com/coreos/flannel ;
2. 查看是否成功
#可以通过下列命令查看是否成功
#查看quay.io/coreos/flannel镜像是否下载到本地
[root@master ~]# docker image ls
#查看master节点状态是否从notReady变成Ready
[root@master ~]# kubectl get nodes
#查看pods具体信息,运行的所有pod,会发现有flannel的pod
[root@master ~]# kubectl get pods -n kube-system -o wide
PS: 上述在线安装,镜像无法下载可以先下载好flannel镜像,重新安装可以按照下列命令操作
3. 自动安装失败处理
#如果按照上述在线安装,重新安装需要先删除所创建的网络配置
[root@master ~]# kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#可以网络查找,也可以下载下面的镜像包链接,将下载后的镜像包导入本地镜像库,导入方法此处不做叙述
#导入完镜像后,再按照执行上述在线安装命令
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
flannel镜像下载路径:https://download.csdn.net/download/qq_24058757/10932884
PS: 参照Master节点的系统环境配置步骤
PS: 参照Master节点的Docker安装,或者其他方法
#创建kubernetes.repo配置文件
#可以参照master节点创建操作,也可以直接将master节点创建号的文件copy过来,copy命令如下:
[root@master ~]# scp /etc/yum.repos.d/kubernetes.repo node01:/etc/yum.repos.d/kubernetes.repo
#准备镜像,这里我是将master节点上的镜像利用docker命令打包转义到node01节点
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.12.1 61afff57f010 3 months ago 96.6MB
k8s.gcr.io/kube-controller-manager v1.12.1 aa2dd57c7329 3 months ago 164MB
k8s.gcr.io/kube-scheduler v1.12.1 d773ad20fd80 3 months ago 58.3MB
k8s.gcr.io/kube-apiserver v1.12.1 dcb029b5e3ad 3 months ago 194MB
k8s.gcr.io/etcd 3.2.24 3cab8e1b9802 4 months ago 220MB
k8s.gcr.io/coredns 1.2.2 367cdc8433a4 4 months ago 39.2MB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 12 months ago 44.6MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 13 months ago 742kB
#在master节点,将上述8个镜像打包
[root@master ~]# docker save \
k8s.gcr.io/kube-proxy \
k8s.gcr.io/kube-controller-manager \
k8s.gcr.io/kube-scheduler \
k8s.gcr.io/kube-apiserver \
k8s.gcr.io/etcd \
k8s.gcr.io/coredns \
quay.io/coreos/flannel \
k8s.gcr.io/pause \
-o k8s_all_image.tar
[root@master ~]# ls
anaconda-ks.cfg k8s k8s_all_image.tar k8s.sh
[root@master ~]# scp k8s_all_image.tar node01:k8s_all_image.tar
#切换到node01节点,导入镜像
[root@node01 ~]# ls
anaconda-ks.cfg k8s k8s_all_image.tar k8s.sh
[root@node01 ~]# docker load -i k8s_all_image.tar
#建立元数据缓存并安装kubelet,kubeadm
#kubectl为命令操作客户端,因为操作基本都在master节点,所以node节点可以不安装,要是喜欢也可以安装
#不指定版本,则默认安装最新版本,目前为1.13版本,这里安装1.12版本
[root@node01 ~]# yum makecache fast && yum install -y kubelet-1.12.1 kubeadm-1.12.1
#在master节点将认证文件复制到node01节点
[root@master ~]# scp /etc/kubernetes/admin.conf node01:/etc/kubernetes/admin.conf
PS:如果上述命令报错,可以拆开分别执行
#修改/etc/sysconfig/kubelet:
[root@node01 ~]# vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--fail-swap-on=false
#设置kubelet服务开机自启
[root@node01 ~]# systemctl enable kubelet.service
#执行之前记录的jion命令,加入集群
[root@node01 ~]# kubeadm join 192.168.50.139:6443 --token nvofhe.0cm44ebb9n18oolf --discovery-token-ca-cert-hash sha256:4e6d77ed6ee4c0be95117fd8576946aa03914985b77a773062dc3dcea0163702
[root@node01 ~]# mkdir -p $HOME/.kube
[root@node01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@node01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
#切换到master节点查看节点信息
[root@master ~]# kubectl get nodes
到此k8s集群环境已经部署完成,可以愉快的玩耍了!!!!!!!如有什么问题,建议底下留言,谢谢
[参考文档]
https://www.kubernetes.org.cn/4956.html