Kubernetes安装

Kubernetes介绍

Kubernetes是一门基于go语言开发的容器编排的技术。容器编排技术有哪些?Docker Swarm、Google Kubernetes和Apache Mesos。各有千秋,同学们自行百度每个软件的区别,Kubernetes目前是使用最为广泛的容器编排软件。

安装说明

Kubernetes有用二进制安装包安装的方式,但是比较费劲,我估计你很快就对k8s失去信心,所以k8s推出了kubeadm的安装方式,将k8s的各个组件都安装在docker之上,以容器的方式运行,也是官方推荐的方式。

我在安装过程中,主要参考了下面这个文章,但是里面有些坑没有标出来,大家可以按照我的步骤安装,安装前可以先把我的博客与这篇博客简单过一遍,基本安装流程就比较顺畅了。

https://www.kubernetes.org.cn/4956.html

安装需要的机器数量大于2台就行了,一台master,其他全是node。当然,如果机器多的话node可以是n台,教程只说两台如何安装。我的环境如下表所示,镜像之前的操作,在master和node都需要操作。

节点 ip
master 192.168.36.108
node 192.168.36.107


安装docker第一步
关于版本问题,提前百度好docker与k8s的版本尽量匹配,可以参考上面链接的博文,里面对版本有部分说明,这里采用了docker的18.06.1-ce,k8s的v1.13.2。安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

第二步

yum makecache fast
yum install -y --setopt=obsoletes=0 \
  docker-ce-18.06.1.ce-3.el7     

第三步

#设置开机启动
systemctl start docker
systemctl enable docker

安装完毕后,应该知道如何查看自己docker安装是否正确了吧,docker version。

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

这里需要注意,关闭防火墙方式不同linux版本不太一样,我这个是centos7,其次也可以不关闭防火墙,可以将k8s涉及要用到的端口开放出来,具体的开放端口大家同学查阅下面的链接。不过线上都是阿里云会提供k8s环境,开发和测试环境开不开防火墙影响貌似不大,直接关了就行了。

https://kubernetes.io/docs/setup/independent/install-kubeadm/

禁用SELINUX

setenforce 0
vi /etc/selinux/config

#查看下面这一项是否是disabled
SELINUX=disabled

这里只需要执行第一个命令就行了,执行完后,用后面的命令是查看禁用成功。如果SELINUX这一项为disabled,就ok了。

创建k8s配置文件

创建/etc/sysctl.d/k8s.conf文件,添加内容如下,命令直接vi就行了。

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

然后执行命令使配置生效

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

kube-proxy开启ipvs

在一部分教程里面会提到这一步,其实这一步可以不做,只是修改了网络转发方式,ipvs会比默认的iptables效率高,但是开发和测试环境无所谓,后来我又问了运维大佬,这一步在开发,测试以及线上环境居然都没修改,也就是没做这一步。还有另外一种说法是新版本的k8s将会自己修改为ipvs(目前我还没落实),所以这一步过吧,阿里云上更不用改。

确认一下iptables filter

有一部分教程中有这一步,后来我结合了各种环境发现这一步其实也是可以不做的。查看命令如下

iptables -nvL

Kubernetes安装

就是红线部分,这个是我自己的环境,我再去给大家看下运维大佬的环境。如下图所示。

Kubernetes安装

Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信。但这里通过安装docker 1806,发现默认策略又改回了ACCEPT,这个不知道是从哪个版本改回的。

大家知道怎么回事就行了,这一步不需要操作,过。

关闭系统的Swap

这一步同学们有要注意了,这一步有两种办法,一个是直接关闭swap,另外一个是在k8s启动参数里面让系统忽略过这一步,这里我用了简单粗暴的第一种。

swapoff -a

查看下是否关闭

free -m

Kubernetes安装

ok了,这里重启后可能配置就失效,所以要修改一下配置文件。

修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载,使用free -m确认swap已经关闭。如下图所示,注意前面注释掉。

Kubernetes安装

安装kubeadm和kubelet

创建kubernetes.repo文件,无脑按我的操作执行就可以。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

这个时候你可能还安装不成功,但是我成功了,不知道为啥,如果安装时提示下载不了安装包,把repo这个文件改成下面的样子,使用阿里云的安装包。

[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

安装命令如下

yum makecache fast
yum install -y kubelet kubeadm kubectl

设置开机启动

systemctl enable kubelet.service

好了,到这里的所有都是准备步骤,需要在你的所有机器上执行,master和node都要执行。下面的部分不太一样了,master的镜像要比node节点上多。

安装k8s镜像

同学们这里master和node节点的镜像不一样哦,先说master上

registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.13.1
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.13.1
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.13.1
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.13.1
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.2.24
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.2.6

直接把这些阿里云的镜像pull到本地master节点上,然后通过docker的tag命令,将所有镜像改成如下格式

k8s.gcr.io/kube-apiserver:v1.13.1
k8s.gcr.io/kube-controller-manager:v1.13.1
k8s.gcr.io/kube-scheduler:v1.13.1
k8s.gcr.io/kube-proxy:v1.13.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.6

这里一定要注意,k8s默认去下载国外的镜像,这里是下载不到的,最好的办法就是下载阿里云后重命名,这里的镜像还不够还需要flannel的镜像,这个后面说。一切都搞定后,对master进行初始化啦。

master节点初始化

kubeadm init \
--apiserver-advertise-address=192.168.36.108 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.13.2 \
--pod-network-cidr=10.244.0.0/16

这里多此一举就是 --image-repository registry.aliyuncs.com/google_containers,这个参数就是指定镜像来源,其实有点多此一举,因为前面已经将阿里云的镜像重命名了,所以可以将这一行去掉执行这个命令。

apiserver-advertise-address这个参数是master本机的地址,记得改下你的地址。pod-network-cidr=10.244.0.0/16指定pod的工作网段,这里使用这个配置就行了。

这里如果成功了,会有一大段输出,找到最后的输出日志里面有下面的一段话。

kubeadm join 192.168.36.108:6443 --token 3ur6wq.kqxcxyh052ue0cj9 --discovery-token-ca-cert-hash sha256:8d54318ada106ebdbe16e73d50003462abf661f052da6d3dd82c9e3ea18989a6

这一句话就是master主节点初始化成功后,后续的node节点通过这个命令加入到k8s集群种的。所以要记录下来,后面要用。

检查master状态

kubectl get cs

Kubernetes安装

如果都是Healthy,集群就是ok的。

安装集群网络插件

目前的网络插件不止flannel,还有calico,另外阿里云也出了一种,这里用flannel(我们线上环境和测试环境都是flannel),对其他感兴趣的同学自己百度吧。

mkdir -p ~/k8s/
cd ~/k8s
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f  kube-flannel.yml

这一步是下载了kube-flannel的yml,通过yml来初始化网络插件的,这里需要下面这个镜像哦,如果下载不下来,继续从阿里云拉过来然后改名字。

quay.io/coreos/flannel: v0.10.0-amd64

检查集群状态

都安装完毕后,用下面的命令查看一下集群种所有的pod的状态。

kubectl get pod –all-namespaces -o wide 

node节点加入k8s集群

如果上面的操作你都成功了,下面就简单了,node节点只下载如下镜像

k8s.gcr.io/kube-proxy:v1.13.1
k8s.gcr.io/pause:3.1
quay.io/coreos/flannel: v0.10.0-amd64

然后执行之前初始化master节点的日志种join那条命令,如下所示

kubeadm join 192.168.36.108:6443 --token 3ur6wq.kqxcxyh052ue0cj9 --discovery-token-ca-cert-hash sha256:8d54318ada106ebdbe16e73d50003462abf661f052da6d3dd82c9e3ea18989a6

总结

如果你安装成功了,那么恭喜你,有问题下面留言就行了。

其实到现在整个k8s,只是安装成功,外界还是不能访问k8s,还有ingress的安装和配置,后面会还有博客介绍。