MENU

使用kubeadm快速部署kubernetes 1.15.2集群

2019 年 08 月 09 日 • 应用服务器

比起二进制安装,使用kubeadm来快速部署kubernetes集群是比较方便快捷的,本文使用kubeadm部署kubernetes 1.15.2集群,十分钟内就能搞定,顺便解决了一个问题,那就是kubeadm的证书问题,默认情况下生成的证书有效期是一年,下文针对这个做了调整。

我这里使用了两台服务器,一个master一个node,系统采用Centos7.6-86_x64,你的服务器需要满足如下要求,

一定要关闭swap&selinux&firewall

安装docker-ce

自行设置主机名修改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://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.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/k8s.conf文件,全部服务器执行,将桥接的IPv4流量传递到iptables的链

[root@kubeadm ~]# cat > /etc/sysctl.d/k8s.conf <<OEF
> 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 <<EOF
> #!/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

安装kubelet/kubeadm/kubectl

还是用阿里云的源,全部服务器执行,顺便安装了ipset

[root@kubeadm ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
> enabled=1
> gpgcheck=0
> repo_gpgcheck=0
> gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.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年改到了十年,这个不是很麻烦,大概这样改,

重新编译kubeadm

这一步不是必须的,看自己的情况吧,从昨天下午开始,我就在找延长证书时间的办法,结果都是需要修改Kubernetes源码后重新重新编译kubeadm,所以我也按着他们方法试了一下,主要是根据这篇文章,我拉完代码后发现他的编译环境镜像版本有点低,编译当前kubernetes源码需要go1.12.1 or later,而他的版本是go1.11.2,所以我看了一下这个镜像的层信息,基于golang:latest镜像重做了一个,能编译后发现这样改不生效,还是默认的一年,经过多次折腾和狗头的帮助终于是成功了,大概是这样,编译环境镜像我也传到dockerhub上了,直接拉就可以了,先把kubernetes源码拉下来吧,

[root@kubeadm ~]# cd /tmp/
[root@kubeadm /tmp]# git clone https://github.com/kubernetes/kubernetes/

拉下来之后挂载到容器去编译,环境都弄好了,

[root@kubeadm /tmp]# docker run -it --rm -v /tmp/kubernetes:/go/src/k8s.io/kubernetes bairuijie/k8s-build:latest bash

这个镜像很大,在1.7G左右,运行以上命令后可以去吸根烟,回来就差不多了,

抽完回来了,然后进入到这个目录,

root@59d82c96c611:/go# cd src/k8s.io/kubernetes/
root@59d82c96c611:/go/src/k8s.io/kubernetes# pwd
/go/src/k8s.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 "k8s.io/kubernetes/cmd/kubeadm/app/constants"
                NotAfter:     time.Now().Add(kubeadmconstants.CertificateValidity).UTC(),

这样就行了,重新编译kubeadm即可,

root@59d82c96c611:/go/src/k8s.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://rj-bai.oss-cn-beijing.aliyuncs.com/kubeadm -O /usr/bin/kubeadm && chmod +x /usr/bin/kubeadm

好了,下面可以初始化集群了,

集群初始化

这里直接用配置文件去初始化了,不用命令行,配置文件如下,

[root@kubeadm ~]# cat kubeadm.yaml 
apiServer:
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.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.k8s.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/admin.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,signing   <none>        system:bootstrappers:kubeadm:default-node-token

加入集群的命名格式如下,

  kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

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    Ready    <none>   3m18s   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的日志就知道了,

就这样,没啥子问题,结束。

最后编辑于: 2019 年 08 月 15 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码