# 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 ` 每台主机添加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 25m v1.17.0 k8s-node2 Ready 25m v1.17.0 ```