步入社会开始工作,项目跟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 root@192.168.0.2:/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 -
kubectl delete node --all
kubeadm reset -f
lsmodyum 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 get pods --namespace=kube-system
-
遇到过的一些问题
- 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本地并添加到环境变量,添加到环境变量后是否生效
- init失败或join失败