1、基础环境
我是用VMware创建的两个虚机(centos)部署的,一个master,一个node,虚拟机要给出2核的配置,否则后面会有提示。
安装K8S前先把环境准备下
1. 停止防火墙
# systemctl disable firewalld
# systemctl stop firewalld
2. 禁用SELinux,让容器可以读取主机文件系统
# setenforce 0 临时办法,重启后失效
修改/etc/sysconfig/selinux 将SELINUX=enforcing改为SELINUX=disabled,永久办法,重启后有效
3. 禁用交换
# swapoff -a 临时办法,重启后无效
# vim /etc/fstab
注释掉 /dev/mapper/centos-swap swap,重启后有效
4. 修改hosts文件
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.59.128 master01 ##新增(本机地址)
192.168.59.129 node01 ##新增 (另一台)
注意:虚拟机默认别名都是localhost.localdomain,在配置好master节点后,再将slave node加入到cluster会报错,故所有虚拟机的hosts都要修改,不能够有相同的名称
5.配置内核参数,将桥接的IPv4流量传递到iptables的链
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
2、安装docker环境
1、安装docker
yum install -y docker
2、添加仓库加速器
修改/etc/docker/daemon.json文件(默认好像是不存在的,使用 vi /etc/docker/daemon.json 会自动创建 )
添加如下:
{
"registry-mirrors":["https://fl791z1h.mirror.aliyuncs.com"]
}
也可使用其他的:比如
Docker 官方中国区:https://registry.docker-cn.com
网易:http://hub-mirror.c.163.com
中国科技大学:https://docker.mirrors.ustc.edu.cn
阿里云:https://pee6w651.mirror.aliyuncs.com
上述完成之后,执行
systemctl daemon-reload
system restart docker
建议使其开机启动 system enable docker
3、安装K8S相关环境
1、添加阿里kubernetes源
vi /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、添加kubectl、kubeadm、kubelet
yum install -y kubectl kubeadm kubelet
注意:
1、如果在拉取镜像的时候从出现1.8版本的coredns拉取失败,可能是安装的最新的kubeadm软件
解决办法:安装1.20版本的kubeadm, yum install -y kubectl-1.20.0-0 kubeadm-1.20.0-0 kubelet-1.20.0-0
1.19版本拉取的coredns镜像是1.7的,可以拉取成功
2、
如下出现错误
[Errno -1] repomd.xml signature could not be verified for kubernetes
- 1
则是 repo 的 gpg 验证不通过导致的,可以修改repo_gpgcheck=0
跳过验证。
启动systemctl start kubelet 并设置开机启动 systemctl enable kubelet
3、拉取镜像并初始化集群
可以使用kubeadm config print init-defaults > init-default-config.yaml 命令查看初始化参数文件
在init-default-config.yaml配置文件中可以定制化自己的仓库地址,pod的ip地址范围等。
可以使用kubeadm config images pull --config=init-default-config.yaml 来拉取镜像,这里的仓库地址是该配置文件中配置的
然后可以使用命令kubeadm init --config=init-default-config.yaml 来初始化集群,也可以使用下面的命令
使用如下命令
kubeadm init --kubernetes-version=1.20.0 \
--apiserver-advertise-address=192.168.59.128 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.100.0.0/16
标注:配置文件中的apiserver-advertise-address必须是本地地址,192.168.149.128是本机地址
10.100.0.0/16 是pod网段
由于kubeadm默认是从k8s.grc.io下载地址,国内无法访问,所以使用了阿里云的镜像仓库
执行完成后会有如下提示
按照上面的提示依次执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后执行如下操作(单纯提示方便):
source <(kubectl completion bash)
若执行失败,可查看虚机是否本身就没有自动提示,可使用此命令安装 yum install -y bash-completion,然后再执行刚才的操作
最后一个红圈标注的就是其他节点加入的命令,此时若想将子节点加入,则需在子节点所在虚拟机上重复上述步骤把环境准备好(不包含此步骤,即拉取镜像并初始化集群)
然后执行在子节点所在虚机上执行
kubeadm join 192.168.59.128:6443 --token mpu67y.dv6hodyklj0g5urd
--discovery-token-ca-cert-hash sha256:9c1f1b66d7ca767268de2f8d4009e4dd3c119d73b4b5cdefca7d3af9e38ddab8
上述步骤都操作完成之后,可使用kubectl get node 查看到node节点为NotReady,因为corednspod没有启动,缺少网络pod
可使用kubectl get pod --all-namespaces 命令即可查看所有的namespace下的pod状态都还是Pending
4、安装calico网络(master上操作)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml(支持最新版本)
问题1:如果出现error: unable to recognize "calico.yaml": no matches for kind "PodDisruptionBudget" in version "policy/v1"
原因:k8s和calico版本不兼容,详看https://projectcalico.docs.tigera.io/archive/v3.20/getting-started/kubernetes/requirements
解决办法:
1、curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
2、kubectl apply -f calico.yaml
问题2:如果安装完成后,kubectl get nodes 发现从节点的状态为NotReady,此时可以查看从节点
是否正常,使用kubectl get nodes,可能会出现如下错误:
The connection to the server localhost:8080 was refused - did you specify the right host or port
问题原因:出现这个问题的原因是kubectl命令需要使用kubernetes-admin的身份来运行,在“kubeadm int”启动集群的步骤中就生成了“/etc/kubernetes/admin.conf”。
解决办法:
将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到工作节点相同目录下:
scp /etc/kubernetes/admin.conf 192.168.59.129:/etc/kubernetes/admin.conf
然后分别在工作节点上配置环境变量:
export KUBECONFIG=/etc/kubernetes/admin.conf echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile(立即生效)
详见:K8S_Kubernetes 出现 The connection to the server localhost:8080 was refused 的解决方法_leenhem的博客-优快云博客
安装完成之后,使用kubectl get pod --all-namespaces 会发现状态变成Running,有些状态变更过来可能会有点慢需等待一段之间,若一直没有变成Running,可自行百度下具体原因
使用 kubectl get node 查看集群状态正常
4、安装dashboard
1、由于官方部署dashboard的服务没使用nodeport,所以将yaml文件下载到本地,在service里添加nodeport
使用如下命令(master上操作):
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml
注:如果下载失败,则可能是githubusercontent 这个网址对应地址没有找到,可在/etc/hosts添加DNS映射
raw.githubusercontent.com 具体对应的地址可百度搜索下,使用截图上面的应该也行(我用的就是这个)
下载完成之后,修改这个文件(注:这个文件里面有两个kind: Service,请选用第一个,其实这两个是由区别的,还请注意区分 )
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort ##新增
ports:
- port: 443
targetPort: 8443
nodePort: 30001 ##新增
selector:
k8s-app: kubernetes-dashboard
修改完成之后,执行 kubectl create -f recommended.yaml
然后再使用 kubectl get pod,svc -n kubernetes-dashboard 查看dashboard关联的pod以及service的状态
2、创建serviceaccount和clusterrolebinding资源YAML文件
执行vi adminuser.yaml ,内容如下
[root@master01 ~]# cat adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
####################分隔符############################
3、创建admin-user并且赋予admin-user集权管理员权限
执行kubectl create -f adminuser.yaml
成功后,在本地浏览器中查看 https://192.168.59.129:30001/ 会发现需要Token
4、查看Token
使用如下命令kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
将Token值输入到浏览器中后查看
以上就是K8S集群的简单部署(包含dashboard)。
#############################################################
搭建过程踩的坑,在此记录下
1、报 [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]:错误
解决方法:echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
2、在子节点加入master忘记token以及hash值
解决方法:kubeadm token list (可能会过期没有了)
可使用kubeadm token create --ttl 0 生成一条永久不过期的
hash值可使用如下命令:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
3、若想将环境给清了,可使用命令: kubeadm reset
4、在安装dashboard失败,想要重新安装时,删除操作:kubectl delete -f recommended.yaml (recommended.yaml为dashboard的)
5、提示报clusterrolebindings.rbac.authorization.k8s.io "admin-user" already exists
解决方法:kubectl delete clusterrolebindings admin-user