centos7+kubeadm+weave部署Kubernetes v1.15.1(无梯子)

步入社会开始工作,项目跟k8s相关,开始了漫长的学习之路。
在网上的教程和导师同事的帮助下终于装好了k8s,感激零涕。
所以写个部署文档,和一些排错用到的命令,给其他小伙伴一些思路。

参考文章

最推崇的是第一篇文章,基本的步骤都有。
1、使用kubeadm安装Kubernetes 1.15
2、CentOS7 用 kubeadm 快速安装 Kubernetes v1.13.4 最新教程
3、Centos7 使用 kubeadm 安装Kubernetes 1.13.3
4、CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇)
5、2019最新k8s集群搭建教程 (centos k8s 搭建)
6、官方文档


大致步骤

  • 基础环境准备
  • 安装kubeadm kubectl kubelet
  • master节点部署
  • node加入集群

----- 至此基本完成k8s的部署,其中1-2步是master和node都需进行的,3、4中除了特别说明的都是master或node执行即可 ------


1、环境准备

本次k8s集群由一台master机和两台node机组成,需要在每台机器上设置hostname。
此外还需 关闭防火墙、关闭交换分区、设置iptables规则,等步骤,root身份比较畅通无阻。

1.1 机器

用的是实验室的虚拟机,官网有给出环境要求

节点角色 IP hostname CPU Memory
master 192.168.0.2 master 四核 8G
node 192.168.0.3 node1 四核 8G
node 192.168.0.4 node2 四核 8G

1.2 各种环境设置

1、设置各主机名,也可以编辑/etc/hostname来完成

[root@master ~]# hostnamectl set-hostname master

[root@node1 ~]# hostnamectl set-hostname node1

[root@node2 ~]# hostnamectl set-hostname node2

2、编辑/etc/hosts文件,添加域名解析

[root@master ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.2 master
192.168.0.3 node1
192.168.0.4 node2

3、关闭防火墙、selinux和swap

//关闭防火墙,实际上要求保留几个端口开发,但是实验环境关闭防火墙比较方便
[root@master ~]# systemctl stop firewalld && systemctl disable firewalld

//查看防火墙状态,not running
[root@master ~]# firewall-cmd --state

//关闭selinux, root
    // 这个是暂时关闭
[root@master ~]# setenforce 0
    // 永久关闭
[root@master ~]# sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

// 关闭交换分区
[root@master ~]# swapoff -a
[root@master ~]# sed -i 's/.*swap.*/#&/' /etc/fstab

// 查看内存情况
[root@master ~]# free -m

4、设置iptables

[root@master ~]# vim /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0

// 执行命令使修改生效
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf

//确认iptables filter中FORWARD链的默认策略为ACCEPT
[root@master ~]#  iptables -nvL

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   10  1259 DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0
   10  1259 DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0
...

5、加载内核模块
在node1和node2上执行以下脚本(我第一次没执行好像也没啥问题)

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
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

接下来还需要确保各个节点上已经安装了ipset软件包yum install ipset。 为了便于查看ipvs的代理规则,最好安装一下管理工具 yum install ipvsadm

1.3 安装docker

1、如果已经安装了docker,但是docker版本不匹配,需要先卸载docker

[root@master ~]# yum remove docker \\
		docker-client \\
		docker-client-latest \\
		docker-common \\
		docker-latest \\
		docker-latest-logrotate \\
		docker-logrotate \\
		docker-selinux \\
		docker-engine-selinux \\
		docker-engine
		
[root@master ~]# rm -rf /etc/systemd/system/docker.service.d
[root@master ~]# rm -rf /var/lib/docker
[root@master ~]# rm -rf /var/run/docker		

2、安装yum扩展工具

[root@master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

3、配置docker下载的地址

[root@master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4、安装docker

//展示版本列表
[root@master ~]# yum list docker-ce --showduplicates|sort -r

//默认安装最新版本
[root@master ~]# yum install –y docker-ce
or
//指定版本下载,本次安装为此版本
[root@master ~]# yum install -y docker-ce-18.06.3.ce-3.el7

5、启动docker

[root@master ~]# systemctl start docker && systemctl enable docker

6、查看docker 信息

[root@master ~]# docker info

7、配置docker国内镜像

[root@master ~]# mkdir -p /etc/docker
[root@master ~]# vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

2、安装kubeadm

1、配置国内kubernetes源

[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

2、安装kubeadm kubelet kubectl

[root@master ~]# yum install -y kubeadm kubelet kubectl

3、开机启动kubelet

[root@master ~]# systemctl enable kubelet.service

这里要说一下,某些教程提到要改10-kubeadm.conf里的Cgroup参数,是不一定的,可以通过

docker info | grep -i cgroup

查看docker的cgroup配置,通过

cat /var/lib/kubelet/config.yaml | grep cgroup

查看kubelet的cgroup配置,
只要两者一样即可,不一样就要修改,否则会报错。

[root@master ~]# vim /etc/docker/daemon.conf

//加入这行,value即kubelet的cgroup值
"exec-opts": ["native.cgroupdriver=<value>"]

然后重启docker使配置生效

[root@master ~]# systemctl daemon-reload
[root@master ~]# service docker restart

也可以修改kubelet的配置文件来使docker和kubelet配置一致。

3、master初始化集群

!!注意此部分是master节点的部署
1、查看安装k8s必须要的镜像,拉取到本地并打上tag

[root@master ~]# kubeadm config images list

可以百度一下脚本,这里摘取文章2的脚本

kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x
docker images |grep mirrorgooglecontainers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2' |sh -x
docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x

COREDNS_VER=`docker images | grep coredns | awk '{print $2}'`

docker pull coredns/coredns:${COREDNS_VER}
docker tag coredns/coredns:${COREDNS_VER} k8s.gcr.io/coredns:${COREDNS_VER}
docker rmi coredns/coredns:${COREDNS_VER}

运行脚本后查看拉取下来的镜像

[root@master ~]# docker images | grep k8s.gcr.io

2、初始化k8s集群
激动人心的时刻到了,这条命令十分关键,
要记得关闭防火墙,关闭swap,关闭selinux,设置iptables,开启kubelet服务
如果之前有执行过init命令要先kubeadm reset

[root@master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.15.1

参数说明详情看官网或–help,如果使用flannel则-pod-network-cidr参数必须设为10.244.0.0/16,其他只要注意不跟机器在同一网段内即可。

注意成功后给出的token需要保留,后续node join到集群中需要该命令,前面的命令则是让其他用户也可以使用kubectl

//让其他用户也可以使用kubectl
To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

//这里需要保存
kubeadm join 192.168.0.2 --token qorg6x.t2jqm4mjdvkft21k \
    --discovery-token-ca-cert-hash sha256:40d66dee2f858bd7745d6acbeb81b87f13b962e71e6fcc0ad4e2868642fb09f0

3、安装weave
参考官网文档执行如下命令:

[root@master ~]# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

4、查看集群状态

[root@master ~]# kubectl get cs

NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health":"true"}

5、查看相关服务运行状态,都处于Running状态即可

[root@master ~]# kubectl get pods -n kube-system -o wide

coredns-5c98db65d4-vts42         1/1     Running   1          4h36m   10.32.0.4      master   <none>           <none>
coredns-5c98db65d4-wp7m7         1/1     Running   1          4h36m   10.32.0.3      master   <none>           <none>
etcd-master                      1/1     Running   1          4h35m   10.113.82.43   master   <none>           <none>
kube-apiserver-master            1/1     Running   1          4h35m   10.113.82.43   master   <none>           <none>
kube-controller-manager-master   1/1     Running   1          4h35m   10.113.82.43   master   <none>           <none>
kube-proxy-xb7xx                 1/1     Running   1          4h36m   10.113.82.43   master   <none>           <none>
kube-scheduler-master            1/1     Running   1          4h35m   10.113.82.43   master   <none>           <none>
weave-net-4prfq                  2/2     Running   2          4h34m   10.113.82.43   master   <none>           <none>

4、node加入集群

!!注意此部分是node节点的部署

1、使用3-1的脚本拉取所需镜像到node机器,否则会join失败,提示imagepullcrash

2、通过3-2保存的token,在node1和node2上申请加入集群

[root@node1 ~]# kubeadm join 192.168.0.2 --token qorg6x.t2jqm4mjdvkft21k \
    --discovery-token-ca-cert-hash sha256:40d66dee2f858bd7745d6acbeb81b87f13b962e71e6fcc0ad4e2868642fb09f0

成功后出现以下字样:

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

3、在master上执行kubectl get nodes命令,能看到三个机器都是ready状态

[root@master ~]# kubectl get nodes

NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   4h47m   v1.15.1
node1    Ready    <none>   4h40m   v1.15.1
node2    Ready    <none>   4h21m   v1.15.1

4、要在node机器上也能使用kubectl,需要把master节点的/etc/kubernetes/admin.conf文件拷贝到各个node机器的相同目录下,并添加到环境变量中

//各node下执行
[root@node1 ~]# scp [email protected]:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf

[root@node1 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
//使环境变量生效
[root@node1 ~]# source ~/.bash_profile

到这里基本上就完成了k8s集群的部署,此时笔者基本没有k8s概念的相关知识,因此可能有很多误导的地方敬请大家指出。

5、其他

下面将给出安装中常用的、上面没有提到的命令。

  • 撤销kubeadm执行过的命令

    kubeadm reset

  • 删除集群中的node

    kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
    kubectl delete node <node name>
    然后在node 上执行 kubeadm reset

  • 卸载k8s相关

    kubectl delete node --all
    kubeadm reset -f
    lsmod

    yum remove -y kubelet kubeadm kubectl
    rm -rf ~/.kube/
    rm -rf /etc/kubernetes/
    rm -rf /etc/systemd/system/kubelet.service.d
    rm -rf /etc/systemd/system/kubelet.service
    rm -rf /usr/bin/kube*
    rm -rf /etc/cni
    rm -rf /opt/cni
    rm -rf /var/lib/etcd
    rm -rf /var/etcd

  • 常用排错命令

    以下命令可以把pod替换为deployment或service

    • kubectl get pods --namespace=kube-system
      查看namespace为kube-system的pod及其状态
    • kubectl get pods --all-namespaces -o wide
      查看所有pod及其状态
    • kubectl describe pod
      某个pod crash时可查看这个pod更多信息
    • kubectl logs
      查看更详细的日志
    • journalctl -f -u kubelet
      查看kubelet应用日志,centos才有
  • kubectl自动补全

  • 官方排错文档

  • 遇到过的一些问题

    • init失败或join失败
      根据提示查找原因,检查selinux、swap、firewalld有无关闭,镜像是否拉取成功,cgroup是否设置一致
    • coredns一直pending
      可能是没安装网络组件weave、calico、flannel等等,
      可以通过kubectl get pods -n kube-system命令查看网络相关pod有没有起
    • coredns crash
      检查防火墙、swap、firewalld、iptables相关设置是否正确
    • kubectl get nodes 命令查不到node节点
      可能是没有添加域名映射
    • node一直not Ready
      查看kubernetes安装需要的相关镜像是否下载成功
    • node执行kubectl时refused
      查看master的/etc/kubernetes/admin.conf是否拷贝到node本地并添加到环境变量,添加到环境变量后是否生效

猜你喜欢

转载自blog.csdn.net/unirrrrr/article/details/98057639