重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
满足以下条件
一台或多台机器,操作系统 CentOS7.x-86_x64
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止swap分区
创新互联为客户提供专业的成都网站建设、成都做网站、程序、域名、空间一条龙服务,提供基于WEB的系统开发. 服务项目涵盖了网页设计、网站程序开发、WEB系统开发、微信二次开发、成都手机网站制作等网站方面业务。
说在前面的话,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
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
在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
#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
在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
#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