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的博客-CSDN博客

安装完成之后,使用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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐