导读 | 比起二进制安装,使用 kubeadm 来快速部署 kubernetes 集群是比较方便快捷的,本文使用 kubeadm 部署 kubernetes 1.15.2 集群,十分钟内就能搞定,顺便解决了一个问题,那就是 kubeadm 的证书问题,默认情况下生成的证书有效期是一年,下文针对这个做了调整。 |
我这里使用了两台服务器,一个 master 一个 node,系统采用 centos7.6-86_x64,你的服务器需要满足如下要求,
一定要关闭 swap&selinux&firewall
自行设置主机名修改 host 文件吧,
[root@kubeadm ~]# cat /etc/hosts 192.168.1.237 kubeadm 192.168.1.224 node-1
开始安装 docker-ce,所有服务器执行,这次用的是阿里云的源,
[root@kubeadm ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 [root@kubeadm ~]# yum-config-manager --add-repo http://www.51sjk.com/upload/articles/1/0/327/327538_20220921102908163.repo [root@kubeadm ~]# yum -y install docker-ce [root@kubeadm ~]# systemctl enable docker.service [root@kubeadm ~]# systemctl start docker.service
这样就可以了,安装目前最新版本,也就是 docker-ce 19.03.1,其实还是建议装 18.09.x 版本的 docker-ce,因为目前 kubeadm 支持列表里还没有 19.x 版本的,我装了 19.03.1 用着貌似也没啥问题,只是在初始化集群的时候抛一条警告,如果想装老版本可以这样搜一下。
[root@kubeadm ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
找到之后就可以指定版本号了进行安装了,
[root@kubeadm ~]# yum install docker-ce-${version}
docker-ce 安装这块就这么多,开始环境初始化吧。
创建 /etc/sysctl.d/**s.conf 文件,全部服务器执行,将桥接的 ipv4 流量传递到 iptables 的链
[root@kubeadm ~]# cat > /etc/sysctl.d/**s.conf <>net.bridge.bridge-nf-call-ip6tables = 1 > net.bridge.bridge-nf-call-iptables = 1 > oef [root@kubeadm ~]# sysctl --system
加载 ipvs 模块,全部服务器执行,
[root@kubeadm ~]# cat > /etc/sysconfig/modules/ipvs.modules <>#!/bin/bash > modprobe -- ip_vs > modprobe -- ip_vs_rr > modprobe -- ip_vs_wrr > modprobe -- ip_vs_sh > modprobe -- nf_conntrack_ipv4 > eof [root@kubeadm ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
还是用阿里云的源,全部服务器执行,顺便安装了 ipset
[root@kubeadm ~]# cat <>/etc/yum.repos.d/kubernetes.repo > [kubernetes] > name=kubernetes > baseurl=http://www.51sjk.com/upload/articles/1/0/327/327538_20220921102908225.jpg > enabled=1 > gpgcheck=0 > repo_gpgcheck=0 > gpgkey=http://www.51sjk.com/upload/articles/1/0/327/327538_20220921102908602.gpg http://www.51sjk.com/upload/articles/1/0/327/327538_20220921102908680.gpg > eof [root@kubeadm ~]# yum -y install kubelet-1.15.2 kubeadm-1.15.2 kubectl-1.15.2 ipset
指定版本,安装 1.15.2 的,
下面开始初始化集群。
上面提到了,默认生成的证书有效期是一年,我在狗头的帮助下将 kubeadm 生成的证书有效期时间由之前的 1 年改到了十年,这个不是很麻烦,大概这样改,
这一步不是必须的,看自己的情况吧,从昨天下午开始,我就在找延长证书时间的办法,结果都是需要修改 kubernetes 源码后重新重新编译 kubeadm,所以我也按着他们方法试了一下,主要是根据这篇文章,我拉完代码后发现他的编译环境镜像版本有点低,编译当前 kubernetes 源码需要 go1.12.1 or later,而他的版本是 go1.11.2,所以我看了一下这个镜像的层信息,基于 golang:latest 镜像重做了一个,能编译后发现这样改不生效,还是默认的一年,经过多次折腾和狗头的帮助终于是成功了,大概是这样,编译环境镜像我也传到 dockerhub 上了,直接拉就可以了,先把 kubernetes 源码拉下来吧,
[root@kubeadm ~]# cd /tmp/ [root@kubeadm /tmp]# git clone http://www.51sjk.com/upload/articles/1/0/327/327538_20220921102908770.jpg
拉下来之后挂载到容器去编译,环境都弄好了,
[root@kubeadm /tmp]# docker run -it --rm -v /tmp/kubernetes:/go/src/**s.io/kubernetes bairuijie/**s-build:latest bash
这个镜像很大,在 1.7g 左右,运行以上命令后可以去吸根烟,回来就差不多了,
抽完回来了,然后进入到这个目录,
root@59d82c96c611:/go# cd src/**s.io/kubernetes/ root@59d82c96c611:/go/src/**s.io/kubernetes# pwd /go/src/**s.io/kubernetes
这里就不扯别的了,直接去改这个文件,再开一个窗口去编辑他,
[root@kubeadm /tmp/kubernetes]# vim ./cmd/kubeadm/app/constants/constants.go certificatevalidity = time.hour * 24 * 365
默认是一年,我加了个 0,也就是十年了,剩下的不要动,保存退出,然后 certificatevalidity 被这里引用,
[root@kubeadm /tmp/kubernetes]# cat ./cmd/kubeadm/app/util/pkiutil/pki_helpers.go kubeadmconstants "**s.io/kubernetes/cmd/kubeadm/app/constants" notafter: time.now().add(kubeadmconstants.certificatevalidity).utc(),
这样就行了,重新编译 kubeadm 即可,
root@59d82c96c611:/go/src/**s.io/kubernetes# make what=cmd/kubeadm goflags=-v
编译成功后二进制文件在./_output/local/bin/linux/amd64/ 目录下,直接覆盖掉 /usr/bin/ 下的 kubeadm 就行了,这个只在 master 节点替换掉就行了,
[root@kubeadm /tmp]# \mv kubernetes/_output/local/bin/linux/amd64/kubeadm /usr/bin/
如果你嫌麻烦可以直接用我这个编译好的,最近又改了一下证书的有效期,总之在座各位有生之年是看不到它过期了,
[root@rj-bai ~]# wget http://www.51sjk.com/upload/articles/1/0/327/327538_20220921102910125.jpg -o /usr/bin/kubeadm && chmod x /usr/bin/kubeadm
好了,下面可以初始化集群了,
这里直接用配置文件去初始化了,不用命令行,配置文件如下,
[root@kubeadm ~]# cat kubeadm.yaml apiserver: extraargs: authorization-mode: node,rbac timeoutforcontrolplane: 4m0s apiversion: kubeadm.**s.io/v1beta2 certificatesdir: /etc/kubernetes/pki clustername: kubernetes dns: type: coredns etcd: local: datadir: /var/lib/etcd imagerepository: swr.cn-north-1.myhuaweicloud.com/rj-bai kind: clusterconfiguration kubernetesversion: v1.15.2 networking: dnsdomain: cluster.local servicesubnet: 10.1.0.0/16 podsubnet: 10.244.0.0/16 --- apiversion: kubeproxy.config.**s.io/v1alpha1 kind: kubeproxyconfiguration mode: ipvs
镜像用的是我华为云上的镜像,启用了 ipvs 代理模式,podsubnet 网段不要改撒,必须是这个,就这样,可以创建了,
[root@kubeadm ~]# systemctl enable kubelet.service [root@kubeadm ~]# kubeadm init --config kubeadm.yaml
看到这个就表示成功了,
让你执行三条命令,执行一下就完了,执行完之后看一下 pod
[root@kubeadm ~]# mkdir -p $home/.kube [root@kubeadm ~]# sudo cp -i /etc/kubernetes/*****.conf $home/.kube/config [root@kubeadm ~]# sudo chown $(id -u):$(id -g) $home/.kube/config
coredns 处于 pending 状态,所以现在需要部署一下容器的网络,还是用 flannel,
[root@kubeadm ~]# wget https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/documentation/kube-flannel.yml [root@kubeadm ~]# sed -i 's#quay.io/coreos/flannel:v0.11.0-amd64#swr.cn-north-1.myhuaweicloud.com/rj-bai/flannel:v0.11.0-amd64#g' kube-flannel.yml [root@kubeadm ~]# kubectl apply -f kube-flannel.yml
网络容器启动后集群就算搭建完了,
[root@kubeadm ~]# kubectl get node [root@kubeadm ~]# kubectl get pod -a
然后看看一下证书的有效期,
没啥问题,下面把节点加进来。
先在 master 看一下目前可用的 token
[root@kubeadm ~]# kubeadm token list token ttl expires usages description extra groups wrf2ek.7ol2dgzajiqce1et 23h 2019-08-09t18:16:34 08:00 authentication,signingsystem:bootstrappers:kubeadm:default-node-token
加入集群的命名格式如下,
kubeadm join: --token --discovery-token-ca-cert-hash sha256:
master-ip:port 不用说了,token 就是上面命令查到的那个,最后 sha256 也就是 ca 证书的 sha256,获取命令如下,
[root@kubeadm ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 13f3ee2bb64a9c770896813fd5c0f0d93756a1020037c82e43c50375a4a0a742
所以我要在 node 节点执行这条,
[root@node-1 ~]$ kubeadm join 192.168.1.143:6443 --token wrf2ek.7ol2dgzajiqce1et \ > --discovery-token-ca-cert-hash sha256:13f3ee2bb64a9c770896813fd5c0f0d93756a1020037c82e43c50375a4a0a742
执行后 node 也会进行一定的初始化工作,会启动一个 flannel&kube-proxy 容器,在 master 等着就行了,一会 node 就会变为 ready,
[root@kubeadm ~]# kubectl get node name status roles age version kubeadm ready master 17m v1.15.2 node-1 ready3m18s v1.15.2
最后测试一波吧,到底能不能用,还是跑个 nginx 试试,
[root@kubeadm ~]# kubectl run nginx --replicas=3 --image=nginx:latest --port=80 [root@kubeadm ~]# kubectl expose deployment nginx --port=80 --type=nodeport --target-port=80 --name=nginx-service [root@kubeadm ~]# kubectl get svc,pod -o wide
访问试试,
再测一下 coredns,
[root@kubeadm ~]# kubectl run -it --image=busybox:1.28.4 --rm --restart=never sh / # nslookup kubernetes
能查到,最后确认一下 kube-proxy 用的是不 ipvs 模式,看一下 kube-proxy 的日志就知道了,
就这样,没啥子问题,结束。