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
相关推荐
###host字段指定授权使用该证书的etcd节点IP或子网列表,需要将etcd集群的3个节点都添加其中。cp etcd-v3.3.13-linux-amd64/etcd* /opt/k8s/bin/