Centos7 集群部署k8s 版本v1.17.4及Dashboard 版本v2.0.0-rc7

616 阅读7分钟

本次用两台虚机,配置如下

ip 节点名称 别名
192.168.3.112 master learn1
192.168.3.113 node learn2
  • Centos版本7.7.1908 linux内核版本5.4.2,k8s对centos版本和内核版本都有要求,所以安装前请仔细核对版本。

  • 几个注意点:

一、master节点2c/2G内存最好,1G内存会出现莫名其妙的坑。所以配置内存稍微大点。

二、对于选择的K8s版本,一定要找到相应的Dashboard版本,否则你的Dashboard可能版本不兼容出现各种错误。Dashboard各版本的github地址 ,Dashboard对应的k8s版本已经列的很清楚了。

1、 k8s集群部署

一、 master和node节点都需要执行的步骤

  1. 关闭防火墙和senforece,hosts中添加服务器ip和别名映射
setenforce 0
service iptables stop

iptables防火墙禁用开机自启 systemctl disable iptables

vi /etc/hosts
192.168.3.112 learn1
192.168.3.113 learn2
  1. 添加路由转发策略

vi /etc/sysctl.d/k8s.conf


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

生效策略 sysctl -p /etc/sysctl.d/k8s.conf

  1. 添加阿里云k8s的yum的源
cat <<EOF > /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/rpm-package-key.gpg
        https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
EOF
  1. 开始安装

Docker的安装参见Docker安装

  • 安装控制工具 指定版本安装因为kbs是1.17.4
yum install -y kubelet-1.17.4 kubeadm-1.17.4 kubectl-1.17.4
  • 关闭swap

注释掉/etc/fstab中的swap选项 建议生产和测试环境用此策略,本机性能差的话先忽略

#/dev/mapper/centos_learn1-swap swap    defaults        0 0
  • 以下步骤只需要在master节点执行
  • 准备镜像 需要去阿里云镜像拉取
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5

再修改为和谷歌名称一样的镜像

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4 k8s.gcr.io/kube-apiserver:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.4 k8s.gcr.io/kube-controller-manager:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.4 k8s.gcr.io/kube-scheduler:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.4 k8s.gcr.io/kube-proxy:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5
  • kubeadm init 启动一个 Kubernetes master 节点,本机加上了--ignore-preflight-errors=Swap,其他环境请忽略。
kubeadm init --kubernetes-version="v1.17.4" --pod-network-cidr="10.244.0.0/16"  --ignore-preflight-errors=Swap

如果初始化失败,则通过kubeadm reset清理环境,再次执行即可。

出现的问题

  1. k8s注册节点提示Docker SystemdCheck]: detected cgroupfs" as the Docker cgroup dr iver. The r ecommended dr fiver is" systemd" 在damen中增进如下配置即可:
   [root-learn1@/root]#vi /etc/docker/daemon.json 

  "exec-opts": ["native.cgroupdriver=systemd"]
重新加载启动docker
[root-learn1@/root]#systemctl daemon-reload
[root-learn1@/root]#systemctl restart docker
再次查看就没问题了
[root-learn1@/root]#docker info | grep Cgrou
 Cgroup Driver: systemd
  • 安装成功
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.3.112:6443 --token mmbw6k.pl97lh4kmk6tm532  
    --discovery-token-ca-cert-hash sha256:27ddddddddd8c4fasdfasdfa1fadasfasafasdfaaaed66ff01761214ff73c1d8 

这里需要记录下kubeadm join的node节点加入集群命令,及其对应的加密串,否则忘记后需要你自己生成。

  • 根据安装成功提示执行
[root-learn1@/root]#mkdir -p $HOME/.kube
[root-learn1@/root]#  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root-learn1@/root]#  sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root-learn1@/root]#cat ~/.kube/config
这个是kubectl使用的默认配置文件,没有这个配置文件是无法连接k8s集群的
查看部署的pod运行情况
[root-learn1@/etc/kubernetes]#kubectl get pods -n kube-system
如果是Running就没问题,否则需要排查下
kubectl describe pod -n kube-system {pod的Name}

二、安装网络插件Flannel,只需master节点部署

  1. 拉取配置文件, 因为配置文件中有镜像因为网络原因quay.io访问不了,需要修改配置文件,所以采用拉取修改配置文件方式。
创建目录存放配置文件
mkdir -p k8s/flunnelconfig
cd k8s/flunnelconfig

拉取配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果连接的站点有问题则在etc/hosts中添加
151.101.76.133 raw.githubusercontent.com

替换镜像源

sed -i 's@quay.io@quay-mirror.qiniu.com@g' kube-flannel.yml
  1. 启动flannel
kubectl apply -f kube-flannel.yml
  1. 查看运行状态
[root-learn1@/root/k8s]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
learn1   Ready    master   94m   v1.17.4

状态为Ready即可。
其他状态也顺便看下,也可以等node节点加入后再综合看下。
kubectl get pods -n kube-system -o wide |grep flannel
如果运行状态不是Running,需要排查下,同master初始化
kubectl describe pod -n kube-system {pod的Name}

三、node节点安装

通用部分参见一、 master和node节点都需要执行的步骤

  1. 镜像安装

只需要安装如下两个镜像即可 ,根据master的步骤执行即可,不再累述。

 k8s.gcr.io/kube-proxy:v1.17.4
 k8s.gcr.io/pause:3.1
  1. node加入Master集群 --ignore-preflight-errors=Swap 只在本机测试用,其他环境请忽略。
[root-learn2@/root]#kubeadm join 192.168.3.112:6443 --token mmbw6k.pl97lh4kmk6tm532  --ignore-preflight-errors=Swap      --discovery-token-ca-cert-hash sha256:27d6f8c4e7eeeeeeeeee9eee22623b6e8aaed66ff01761222222ff73c1d8 

  1. 查看节点加入状态

可以在maseter节点查看,如果想要在node节点执行kubectl get podes ,则需要把/root/.kube/config文件从master节点拷贝过来

[root-learn2@/root/.kube]#kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   
[root-learn2@/root/.kube]#

[root-learn2@/root]#kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
learn1   Ready    master   38h   v1.17.4
learn2   Ready    <none>   25h   v1.17.4

到现在为止集群环境就搭建完成了,如果再加入多个node,可以复制node的安装步骤即可。 接下来看下K8s的WebUI界面Dashboard如何部署。

2、Dashboard部署

本次选择了在Master节点上安装,因为给Master节点分配的资源比node节点的充裕些。

版本选择在文章开头就说过了,很重要!!!!很重要!!!!很重要!!!!

安装步骤

  1. 删除旧的Dashboard,注意kubernetes-dashboard命名空间下不要放其他pods,否则删除就麻烦了。
   kubectl delete ns kubernetes-dashboard
  1. 下载yaml文件,因为要修改其中的几个地方,根据文章开头的github地址的安装指引找到下载地址
wget  https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml
  1. 修改配置文件的service通过NodePort方式访问K8S Dashboard,否则只能通过虚拟机本身来访问。
[root-learn1@/root/k8s/dashborads]#vi  recommended.yaml
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort #新加此行
  ports:  
    - port: 443
      targetPort: 8443
      nodePort: 32100 #新加此行
 添加如下两处
 type: NodePort #新加此行   
 nodePort: 32100 #新加此行
  1. 启动Dashboard
[root-learn1@/root/k8s/dashborads]#kubectl apply -f recommended.yaml

[root-learn1@/root/k8s/dashborads]#kubectl get service -n  kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.111.19.226   <none>        8000/TCP        3h27m
kubernetes-dashboard        NodePort    10.96.178.193   <none>        443:32100/TCP   3h27m

由于指定了端口可以通过https://192.168.3.112:32100,注意是443端口,所以是https访问。问题就来了,firefox访问没问题,chrome有问题,都是因为证书失效的原因,网上也有几种获取证书的方法,不再累述,这里我们因为是自己的环境,所以采用手工生成证书的方式。

1、停掉pod
kubectl delete -f recommended.yaml

2、手动创建命名空间
kubectl  create namespace kubernetes-dashboard

3、创建目录,自定义即可
cd 到自定义目录我这里是/root/k8s/dashborads/certs/

先生成证书
openssl genrsa -out dashboard.key 2048

192.168.3.112这个可以替换长自己的ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.3.112'

生成证书
openssl x509 -req -days 3650 -in dashboard.csr -signkey dashboard.key -out dashboard.crt

删除原有证书
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard

通过新生成的证书创建secret

kubectl create secret generic kubernetes-dashboard-certs --from-file=/root/k8s/dashborads/certs/dashboard.key  --from-file=/root/k8s/dashborads/certs/dashboard.crt -n kubernetes-dashboard

创建完成secret后需要修改recommended.yaml

 containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.0.0-rc7
          imagePullPolicy: Always
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            - --tls-cert-file=dashboard.crt
            - --tls-key-file=dashboard.key
            - --token-ttl=3600

说明

增加如下参数

        - --tls-cert-file=dashboard.crt
        - --tls-key-file=dashboard.key
        - --token-ttl=3600
       不要注释 - --auto-generate-certificates这个参数不仅仅是自动证书的开关,还是总的HTTPS的开关,当我们手工配置了证书后,容器不会自动生成
        - --tls-cert-file=dashboard.crt  名称对应/root/k8s/dashborads/certs/下的dashboard.crt  挂载后容器去/certs/下找你映射的这个文件名称
        - --tls-key-file=dashboard.key 名称对应/root/k8s/dashborads/certs/下的dashboard.key 挂载后容器去/certs/下找你映射的这个文件名称
        - --token-ttl=3600

重建pod

kubectl apply -f recommended.yaml
  1. 此时你用chrome登录后就弹出需要验证token了,如下:

recommended.yaml配置文件中的普通用户是无法登录的,所以需要我们新建一个有集群管理角色的用户来登录.新建一个yaml文件我这里为dashboard-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
创建了一个admin-user,用户名字随便起,赋予ClusterRoleBinding角色权限,关联到clusert-admin(名称是固定的不能修改)。

创建账户

kubectl apply -f dashboard-adminuser.yaml

查看生成的token

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

注意生成的token前面有一串空格,不同版本要求不一样,有的需要拷贝带空格,有的不需要,我这个版本不需要,所以直接拷贝内容即可。登录成功后如下

  • 当出现匿名用户不能访问时,暂时先绑定下角色。
kubectl create clusterrolebinding system:anonymous   --clusterrole=cluster-admin   --user=system:anonymous

但是这不是最终解决方法,我后来把这个绑定角色又删除了,清理浏览器缓存后再用生成的token登录就好了。