前言

本例基于有一定docker基础使用,如有任何问题请联系我,公众号【IT散记】

重点介绍:详细的部署流程,其中的一些坑以及如何利用镜像仓库构建国外源的镜像,
安装集群可视化Dashboard,添加节点,内容丰富!


以下为正文,有遇到其他问题,请留言讨论

一、基础环境

操作系统:centos 7.0+ /Redhat 7.0+
虚拟机推荐 内存>=2GB

二、部署步骤

1.定义hostname

代码如下:

hostname k8s-master
//节点之中不可以有重复的主机名

2.编辑 /etc/hosts

代码如下:

vi /etc/hosts

#当然我们在这⾥根据实际情况指定⾃⼰的ip地址即可
192.168.2.2 k8s-master

3.修改其他配置等操作

关闭防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld
$ iptables -F

关闭selinux:
$ sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
$ sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
$ setenforce 0
$ cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

关闭swap:
$ swapoff -a $ 临时
$ vim /etc/fstab $ 永久
$ sed -i 's/.*swap.*/#&/' /etc/fstab
cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Mon Mar  4 17:23:04 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=3dd5660e-0905-4f1e-9fa3-9ce664d6eb94 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0


将桥接的IPv4流量传递到iptables的链:
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system
修改文件句柄限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
echo "* soft nproc 65536"  >> /etc/security/limits.conf
echo "* hard nproc 65536"  >> /etc/security/limits.conf
echo "* soft  memlock  unlimited"  >> /etc/security/limits.conf
echo "* hard memlock  unlimited"  >> /etc/security/limits.conf

4.所有节点安装Docker/kubeadm/kubelet

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

(1)安装Docker
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
(2)添加yum软件源
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF

导入gpgkey文件
$ wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
$ rpm --import yum-key.gpg
$ wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
$ rpm --import rpm-package-key.gpg
(3)yum安装kubeadm/kubelet/kubectl

# yum install -y docker kubelet kubeadm kubectl --disableexcludes=kubernetes
提示:可以自行指定版本,否则默认最新,示例:
$ yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0
$ systemctl enable kubelet

5.部署Kubernetes Master

我们事先可以通过如下命令查看所依赖的docker镜像版本kubeadm config images list,然后通过国内镜像仓库下载所需的镜像文件。
最新

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
注意:在这里的版本号⼀一定要先通过上述命令查看后在填写,本例中的是v1.19.0后续可能版本会有 变化,因为国内的源随时可能更新k8s的版本

6.构建我们自己的 Docker 镜像(不怕被墙)

主要使用阿里云提供的 “容器镜像服务”,它不但提供了镜像的托管能力,还提供了国内外镜像构建服务,而且还免费。

注意,接下来讲的跟阿里云提供的 “容器镜像加速” 不是同一个东西,加速是解决速度慢的问题,前提是能访问。下面讲一下在国内由于不可描述的原因根本无法访问的镜像(比如 k8s.gcr.io/kube-···)。

第一步:在 GitHub 上创建代码仓库

点击这里参考
https://github.com/DonkeyL/docker-image-wrapper(可直接Fork)

//举例Dockerfile
FROM k8s.gcr.io/kube-apiserver:v1.19.0
MAINTAINER yourname <yourname@example.com>

第二步:阿里云创建镜像仓库

凡人

2.1 创建命名空间

创建一个命名空间,“默认仓库类型” 公有 或 私有 都可以。我这里是 私有。

2.2 创建镜像仓库

创建一个镜像仓库,地域选择离自己近的,命名空间选择上面创建的 ,仓库名称为 kube-apiserver,仓库类型任意(我这选择公开),如图:


点击『下一步』,开始关联代码仓库,这里选择 GitHub,关联第一步在 GitHub 上创建的代码仓库:


可以看到,除了 GitHub ,还有很多其它的选项,如果 GitHub 访问也吃力的话,可以选择其它的类型。

勾选『海外机器构建』,第一个自动构建镜像勾不勾选都可以,后面配置构建策略的时候可以更改。

然后点击『创建镜像仓库』

2.3 添加构建规则

这一步是配置构建规则,比如分支名、Dockerfile 路径等信息,进入构建页面,点击『添加规则』,如图:

在这里插入图片描述

添加一条构建规则,如图:

在这里插入图片描述

如上,内容可根据情况自行修改。

2.4 构建镜像

创建完构建规则后,点击『立即构建』,如图:
在这里插入图片描述
等待构建成功即可。到此构建完成

2.5 获取镜像

镜像构建完成了,开始获取镜像,如图:

在这里插入图片描述
注意,第一步 docker login 的时候,需要输入的密码并不是阿里云的登录密码,而是这里单独设置的:

在这里插入图片描述

在自己主机将将镜像pull下来之后,按照要求进行tag

//举例,要按照步骤五的图片中示例将镜像tag
# docker tag registry.cn-hangzhou.aliyuncs.com/docker-self/kube-apiserver k8s.gcr.io/kube-apiserver:v1.19.0
# docker tag registry.cn-hangzhou.aliyuncs.com/docker-self/pause k8s.gcr.io/pause:3.2
...
...
//可删除原来的镜像
# docker image rm registry.cn-hangzhou.aliyuncs.com/docker-self/kube-apiserver/kube-apiserver
...

同理可获取任何国外源镜像,速度还是可以的。比如我就通过这种方式构建了 K8s 集群的所有镜像,如图:
在这里插入图片描述

7.初始化Master环境

$ kubeadm init \
--kubernetes-version v1.19.0 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=NumCPU 

当运行成功后会出现的提示信息,我们注意以下几点

根据提示信息我们可以运行

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

记录秘钥,添加节点使用

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.2.2:6443 --token er6af9.i52gp9isqe0pzakl \
    --discovery-token-ca-cert-hash sha256:e3700a8367647daab4331bd19bcbcb938629844d570c817fca0881cd35a41a74 

8.按需开启master创建pod的功能

kubectl taint nodes --all node-role.kubernetes.io/master-

默认情况出于安全考虑 master节点是不允许创建pod的,我们可以通过如上命令开启此功能

9.安装网络插件

$ iptables -P FORWARD ACCEPT

$ kubectl apply -f    https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

flannel或者calico均可,镜像都可以自己通过阿里云下到本地再执行以上命令

10.大功告成

当所有运行完成后 我们可以通过
kubectl get pods --all-namespaces
来查看pod的运⾏行行状态,当所有为run的状态时,证明启动完毕。
在这里插入图片描述

都进行到这了,不妨安个dashboard再走吧

二、K8S集群可视化管理

1.查看pod运行情况

如果你的结果和我的一样,那么证明集群启动成功。
在这里插入图片描述
接下来进行页面dashboard安装。

2.下载recommended.yaml文件

# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

提示:这里的地址不唯一(版本差别),但是接下来的教程大同小异,可放心食用
或者从https://github.com/kubernetes/dashboard/releases上边找到和自己安装的k8s相对于的dashboard的版本,再下载其recommended.yaml

Next,cat查看下载的文件,获取里面所需的镜像版本,通过阿里云构建使用。

3.构建页面化dashboard所需镜像

我这里通过yaml文件获取到需要下载的镜像为:
image: kubernetesui/metrics-scraper:v1.0.4
#在新版的K8S中,系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存、磁盘、CPU和网络的使用率等信息。
image: kubernetesui/dashboard:v2.0.0
提示:解决方式不唯一,可以替换国内镜像源(简单),也可以自己构建国外镜像(实用)。

接下来就是通过上文介绍方式自行构建镜像,可参照我的github以及上文构建教程。[戳我]
(https://github.com/DonkeyL/docker-image-wrapper)

4.修改recommended.yaml文件

vim recommended.yaml
需要修改的内容如下所示。

---
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: 30000 #增加
  selector:
    k8s-app: kubernetes-dashboard
---
#因为自动生成的证书很多浏览器无法使用,所以我们自己创建,注释掉kubernetes-dashboard-certs对象声明
#apiVersion: v1
#kind: Secret
#metadata:
#  labels:
#    k8s-app: kubernetes-dashboard
#  name: kubernetes-dashboard-certs
#  namespace: kubernetes-dashboard
#type: Opaque
---

5.创建证书

mkdir dashboard-certs

cd dashboard-certs/

#创建命名空间
kubectl create namespace kubernetes-dashboard

# 创建key文件
openssl genrsa -out dashboard.key 2048

#证书请求
openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert'

#自签证书
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt

#创建kubernetes-dashboard-certs对象
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard

6.安装dashboard

kubectl create -f ~/recommended.yaml

注意:这里可能会报如下所示。

Error from server (AlreadyExists): error when creating "./recommended.yaml": namespaces "kubernetes-dashboard" already exists

这是因为我们在创建证书时,已经创建了kubernetes-dashboard命名空间,所以,直接忽略此错误信息即可。

7.查看安装结果

在这里插入图片描述

8.创建dashboard管理员

创建dashboard-admin.yaml文件。
vim dashboard-admin.yaml
文件的内容如下所示。

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: dashboard-admin
  namespace: kubernetes-dashboard

保存退出后执行如下命令创建管理员。

kubectl create -f ./dashboard-admin.yaml

9.为用户分配权限

创建dashboard-admin-bind-cluster-role.yaml文件。

vim dashboard-admin-bind-cluster-role.yaml

文件内容如下所示。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin-bind-cluster-role
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard

保存退出后执行如下命令为用户分配权限。

kubectl create -f ./dashboard-admin-bind-cluster-role.yaml

10.查看并复制用户Token

在命令行执行如下命令。

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

具体执行情况如下所示。

[root@~]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
Name:         dashboard-admin-token-p8tng
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: c3640b5f-cd92-468c-ba01-c886290c41ca

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlVsRVBqTG5RNC1oTlpDS2xMRXF2cFIxWm44ZXhWeXlBRG5SdXpmQXpDdWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcDh0bmciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYzM2NDBiNWYtY2Q5Mi00NjhjLWJhMDEtYzg4NjI5MGM0MWNhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.XOrXofgbk5EDa8COxOkv31mYwciUGXcBD9TQrb6QTOfT2W4eEpAAZUzKYzSmxLeHMqvu_IUIUF2mU5Lt6wN3L93C2NLfV9jqaopfq0Q5GjgWNgGRZAgsuz5W3v_ntlKz0_VW3a7ix3QQSrEWLBF6YUPrzl8p3r8OVWpDUndjx-OXEw5pcYQLH1edy-tpQ6Bc8S1BnK-d4Zf-ZuBeH0X6orZKhdSWhj9WQDJUx6DBpjx9DUc9XecJY440HVti5hmaGyfd8v0ofgtdsSE7q1iizm-MffJpcp4PGnUU3hy1J-XIP0M-8SpAyg2Pu_-mQvFfoMxIPEEzpOrckfC1grlZ3g

可以看到,此时的Token值为:

eyJhbGciOiJSUzI1NiIsImtpZCI6IlVsRVBqTG5RNC1oTlpDS2xMRXF2cFIxWm44ZXhWeXlBRG5SdXpmQXpDdWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcDh0bmciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYzM2NDBiNWYtY2Q5Mi00NjhjLWJhMDEtYzg4NjI5MGM0MWNhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.XOrXofgbk5EDa8COxOkv31mYwciUGXcBD9TQrb6QTOfT2W4eEpAAZUzKYzSmxLeHMqvu_IUIUF2mU5Lt6wN3L93C2NLfV9jqaopfq0Q5GjgWNgGRZAgsuz5W3v_ntlKz0_VW3a7ix3QQSrEWLBF6YUPrzl8p3r8OVWpDUndjx-OXEw5pcYQLH1edy-tpQ6Bc8S1BnK-d4Zf-ZuBeH0X6orZKhdSWhj9WQDJUx6DBpjx9DUc9XecJY440HVti5hmaGyfd8v0ofgtdsSE7q1iizm-MffJpcp4PGnUU3hy1J-XIP0M-8SpAyg2Pu_-mQvFfoMxIPEEzpOrckfC1grlZ3g

查看dashboard界面

在浏览器中打开链接 https://192.168.2.2:30000 ,如下所示。
在这里插入图片描述
这里,我们选择Token方式登录,并输入在命令行获取到的Token,到此,k8s的dashboard就安装完了,我们就可以愉快的通过图形界面进行操作了。
在这里插入图片描述

问题示例(爬坑)

1,问题描述

(1)在安装配置好 Kubernetes 后,正常情况下服务器关机重启,kubelet 也会自动启动的。但最近配置的一台服务器重启后,输入命令 kubectl get nodes 查看节点报如下错误:

The connection to the server 192.168.2.2:6443 was refused - did you specify the right host or port?

(2)输入 systemctl status kubelet 命令查看 kubelet 的情况,发现 kubelet 确实没有启动:

[root@k8s-master /]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: activating (auto-restart) (Result: exit-code) since Wed 2020-09-16 11:00:11 CST; 4s ago
     Docs: https://kubernetes.io/docs/
  Process: 18387 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=255)
 Main PID: 18387 (code=exited, status=255)

Sep 16 11:00:11 k8s-master kubelet[18387]: goroutine 106 [runnable]:
Sep 16 11:00:11 k8s-master kubelet[18387]: k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record.(*eventBroadcasterImpl).S...5d230)
Sep 16 11:00:11 k8s-master kubelet[18387]: /workspace/anago-v1.19.0-rc.4.197+594f888e19d8da/src/k8s.io/kubernetes/_output/d...go:299
Sep 16 11:00:11 k8s-master kubelet[18387]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record.(*eventBroadca...atcher
Sep 16 11:00:11 k8s-master kubelet[18387]: /workspace/anago-v1.19.0-rc.4.197+594f888e19d8da/src/k8s.io/kubernetes/_output/d... +0x6e
Sep 16 11:00:11 k8s-master kubelet[18387]: goroutine 107 [runnable]:
Sep 16 11:00:11 k8s-master kubelet[18387]: k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record.(*eventBroadcasterImpl).S...b23c0)
Sep 16 11:00:11 k8s-master kubelet[18387]: /workspace/anago-v1.19.0-rc.4.197+594f888e19d8da/src/k8s.io/kubernetes/_output/d...go:299
Sep 16 11:00:11 k8s-master kubelet[18387]: created by k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record.(*eventBroadca...atcher
Sep 16 11:00:11 k8s-master kubelet[18387]: /workspace/anago-v1.19.0-rc.4.197+594f888e19d8da/src/k8s.io/kubernetes/_output/d... +0x6e
Hint: Some lines were ellipsized, use -l to show in full.

2,问题原因

由于 K8s 必须保持全程关闭交换内存,之前我安装是只是使用 swapoff -a 命令暂时关闭 swap。而机器重启后,swap 还是会自动启用,从而导致 kubelet 无法启动。

3,解决办法

(1)首先执行如下命令关闭 swap。

swapoff -a

(2)接着编辑 /etc/fstab 文件。

vi /etc/fstab

(3)将 /dev/mapper/centos-swap swap swap default 0 0 这一行前面加个 # 号将其注释掉。

(4) 编辑完毕后保存退出。这样机器重启后 kubelet 也可以正常自动启动了。

总结

坑很多!很多!多!
添加集群节点、创建应用、pod与pvc等等知识后面再聊。
以上内容只是入门教程,有什么问题请留言讨论,欢迎指点,希望帮助到更多的人。有一些坑因为篇幅过长,我会单写解决的文章。
更多入门到进阶知识,请关注我公众号【IT散记】

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐