kubeadm安装k8s集群1.17版本

kubeadm安装k8s集群1.17版本

一、安装要求:

满足以下条件
一台或多台机器,操作系统 CentOS7.x-86_x64
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止swap分区

说在前面的话,kubeadm是k8s官方推出的一个用于快速部署一套k8s集群的工具,而在近几年现在kubeadm上生产的公司也有了,不过对于各个方面对于集群的管理以及二次性的开发,大多数都是采用二进制的方式进行去部署生产上的k8s集群,由于k8s版本更新比较频繁,像对于拿k8s集群进行一些测试方面的操作,平时希望自己能够快速的部署一套进行测试,而对于二进制以及Ansible部署的方式当然也可以部署,不过二进制就慢了很多,像ansible的话还得需要一台服务器单独拿出来做管理节点,对于我们平时拿虚拟机去测试的话,如果自己的机器比较紧张,kubeadm也是一个比较不错的选择,另外也是尝试一下新版本的k8s,紧跟官方新版本的脚步。

话不多说,进入正题

在kubeadm中有两条重要的命令,一个是kubeadm init,一个是kubeadm join, init 主要的实现就是去创建一个master节点,而在运行init之后,首先会运行一系列的输出,首先它会检查你的docker版本或者你的swap有没有关闭,因为docker首先是必须要运行的,在k8s集群中,docker是用来启动我们的容器和镜像的下载的,而swap需要进行关闭,这是k8s官方提出的一个默认的规则,在k8s-1.8之后就是需要你关闭swap,否则会出现报错,目的开启swap会占用大的内存,也会对性能影响很大的消耗。

第二它会生成一个用来认证k8s组件之间进行调用的CA证书,证书有两套,第一个就是k8s的证书,另一套就是etcd的证书,而这个证书kubeadm安装的放置证书的位置在/etc/kubernetes/pki下面。

第三它会把kubelet、controller-manager和scheduler等组件的配置文件写到/etc/kubernets/目录中,里面包含了一些证书文件,这些主要用来连接api-server,除了上面几个配置文件,还会生成一个管理相关的admin.conf文件

第四它会生成token文件,如果其他节点加入进来到master的话,就会使用到这个token

第五设置一些允许节点以 Bootstrap Tokens) 和 TLS bootstrapping 方式加入集群的必要的操作
设置csr请求自动认证的机制,这个的话,kubeadm是自己做好的,部署过二进制的应该知道,当node加入进来的时候,我们需要对它授权approve,手动允许加入集群中

第六,部署dns服务,kube-proxy插件,当然一般DNS服务需要我们部署好flannel网络插件之后,这个服务才能运行起来

大概的流程是这样的,详情请看官网文档
https://kubernetes.io/

二、集群配置

k8s-master            192.168.1.15
k8s-node1             192.168.1.11
k8s-node2             192.168.1.14

系统初始化配置(每个节点都需要配置)

关闭防火墙:

#systemctl stop firewalld
#systemctl disable firewalld

关闭selinux:

#sed -i ‘s/enforcing/disabled/‘ /etc/selinux/config  # 永久
#setenforce 0  # 临时

关闭swap:

#swapoff -a  # 临时
#vim /etc/fstab  # 永久

设置主机名:主机名根据自己的主机去使用这条命令
#hostnamectl set-hostname <hostname>

每台主机添加hosts:

#cat >> /etc/hosts << EOF
192.168.1.15 k8s-master
192.168.1.11 k8s-node1
192.168.1.14 k8s-node2
EOF

将桥接的IPv4流量传递到iptables的链:

#cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#sysctl --system  # 生效

时间同步:

#yum install ntpdate -y
#ntpdate us.pool.ntp.org

三、 所有节点安装Docker/kubeadm/kubelet

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
3.1 安装Docker

#wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#yum -y install docker-ce-18.06.1.ce-3.el7
#systemctl enable docker && systemctl start docker
#docker --version
Docker version 18.06.1-ce, build e68fc7a

镜像加速剂
Daocloud公司建议使用,提高镜像下载速度,使用k8s官方默认的cgroup的

systemd
#more /etc/docker/daemon.json 
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
 "exec-opts":["native.cgroupdriver=systemd"]
}
重启docker
#systemctl restart docker

3.2 所有节点添加阿里云YUM软件源

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

3.3 所有节点安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:

#yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
#systemctl enable kubelet

四、部署Kubernetes Master

在192.168.1.15(Master)执行
并将--apiserver -advertise-address的地址写成master的地址
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
对于其他的办法,或者就是提前将镜像下载好,然后导进去,其实这块阿里云仓库默认已经有维护的k8s组件的镜像了,这里直接可以使用

#kubeadm init --apiserver-advertise-address=192.168.1.15 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.17.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

kubeadm init,执行init 初始化之后会显示k8s的版本,第二就是检查配置比如swap关闭,docker的cgroup,k8s默认需要的是systemd的驱动程序,另外需要去下载k8s组件所需要的镜像,这里需要等待一会.....

[init] Using Kubernetes version: v1.17.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using ‘kubeadm config images pull‘

使用kubectl工具:
默认init初始化之后会输入下面应该操作的步骤,直接执行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

由于我们的网络cni插件还没有部署,所以它的状态一直是未就绪状态

#kubectl get nodes
NAME         STATUS     ROLES    AGE   VERSION
k8s-master   NotReady   master   19m   v1.17.0

五、安装Pod网络插件(CNI)

#mkdir /k8s-cni
#wget -P /k8s-cni https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

默认这个网络插件下载会出现一些问题,拉取不到,导致网络不通,节点无法准备就绪
可以改成这个镜像地址,到flannel的yaml下,找到amd64有两行放置flannel的镜像的位置替换为:zhaocheng172/flannel:v0.11.0-amd64
确保flannel起来

#kubectl get pod -A
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-9d85f5447-htzgm              1/1     Running   0          27m
kube-system   coredns-9d85f5447-sz9kg              1/1     Running   0          27m
kube-system   etcd-k8s-master                      1/1     Running   0          27m
kube-system   kube-apiserver-k8s-master            1/1     Running   0          27m
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          27m
kube-system   kube-flannel-ds-amd64-5r2qv          1/1     Running   0          4m13s
kube-system   kube-proxy-npgrm                     1/1     Running   0          27m
kube-system   kube-scheduler-k8s-master            1/1     Running   0          27m

六、加入Kubernetes Node

在192.168.1.11/14(Node)执行。
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:
加入之后需要等待一会时间,因为它会像k8s的node节点都启动两个flanneld的进行,打通跨主机节点之间容器的通信,验证命令kubectl get pod -A

#kubeadm join 192.168.1,15:6443 --token esce21.q6hetwm8si29qxwn   --discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5

七、查看node是否加入进来

#kubectl get node
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   55m   v1.17.0
k8s-node1    Ready    <none>   25m   v1.17.0
k8s-node2    Ready    <none>   25m   v1.17.0

相关推荐