目录

 

一、部署环境

Kubernetes集群组件:

Kubernetes 为你提供:

二、安装准备工作

2.0 修改主机名

2.1 关闭防火墙和关闭selinux

2.2 检查开放Kubernetes各组件所需的端口

Control-plane node(s)

2.3 禁用swap虚拟内存(所有节点都要执行)

 

2.4 内核参数修改

2.5 修改hosts文件

2.6 设置kubernetes源

2.7 更新缓存

三、Docker配置

3.1 命令补全 安装bash-completion

3.2 docker镜像加速(已经配置请忽略)

3.3 登陆阿里云容器模块获取镜像加速地址

3.4 配置镜像加速器

四、k8s安装

4.1 kubelet 版本信息查看

4.2 安装kubelet、kubeadm和kubectl

4.3 启动kubelet

4.4 kubectl命令补全

4.5 镜像下载

node节点直接运行启动命令: kubeadm init  无需初始化master

五、初始化master

5.1 修改kubelet配置默认cgroup driver

5.2 环境是否正常

5.3 初始化master 10.244.0.0/16是flannel固定使用的IP段,设置取决于网络组件要求

5.4 如初始化失败可执行kubeadm reset 命令来清理环境重新安装

5.5 配置master认证

5.6 安装flannel网络

 配置hosts

 在master上新建flannel网络

六、node节点加入集群

6.1 集群节点查看

6.2 node加入集群

七、安装Kubernetes Dashboard

7.1 下载yaml

Dashboard v2.0.4 兼容性

7.2 修改recommended.yaml配置文件实现外网访问

7.3 运行部署:

7.4 查看状态:

7.5 创建dashboard-admin.yaml文件保存以下信息:

7.6 运行以下命令:

7.7 获取创建的 admin 账户的令牌token:

7.8 正常会打印以下内容:

7.9 外网访问Dashboard页面

登陆页面

操作面板页面

 


一、部署环境

主机列表:

主机名Centos版本IPdocker versionflannel version主机配置k8s版本
master7.8.2003192.168.214.12819.03.13v0.13.0-rc22CPU 2Gv1.19.4
node017.8.2003192.168.214.12919.03.13/2CPU 2Gv1.19.4
node027.8.2003192.168.214.13019.03.13/2CPU 2Gv1.19.4

安装测试共有3台服务器 1台master,2台node。

服务器是一组云服务器服务器可以通过内网连接的。

官方建议服务器最低配置为2CPU 2GB(至少2GB)或更多的CPU和RAM。

Kubernetes集群组件:

  • etcd 一个高可用的K/V键值对存储和服务发现系统

  • flannel 实现夸主机的容器网络的通信

  • kube-apiserver 提供kubernetes集群的API调用

  • kube-controller-manager 确保集群服务

  • kube-scheduler 调度容器,分配到Node

  • kubelet 在Node节点上按照配置文件中定义的容器规格启动容器

  • kube-proxy 提供网络代理服务

Kubernetes 为你提供:

  • 服务发现和负载均衡

    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排

    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚

    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • 自动完成装箱计算

    Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。

  • 自我修复

    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理

    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

Kubernetes官方地址:https://kubernetes.io

Kubernetes官方项目地址:https://github.com/kubernetes/kubernetes

二、安装准备工作

2.0 修改主机名

三台服务对应分别执行

主机名可自定义(目前的修改便于区分服务器所在的节点)

# 主节点
[root@centos7 ~] hostnamectl set-hostname master
# 节点1
[root@centos7 ~] hostnamectl set-hostname node01
# 节点2
[root@centos7 ~] hostnamectl set-hostname node02

修改完成后退出重新SSH登陆即可显示新设置的主机名master

2.1 关闭防火墙和关闭selinux

三台服务器全部需要执行

关于关闭防火墙(仅用于测试环境,生产环境请勿使用)

如使用云服务器(如阿里云ECS 到服务器安全组手动增加相关端口)

关闭selinux的原因(关闭selinux以允许容器访问宿主机的文件系统)

# 关闭防火墙和设置开机禁用防火墙
[root@centos7 ~] systemctl stop firewalld && systemctl disable firewalld 

# 永久关闭selinux 
[root@centos7 ~] sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config;cat /etc/selinux/config 

# 临时关闭selinux 
root@centos7 ~] setenforce 0

2.2 检查开放Kubernetes各组件所需的端口

Control-plane node(s)

ProtocolDirectionPort RangePurposeUsed By
TCPInbound6443*Kubernetes API serverAll
TCPInbound2379-2380etcd server client APIkube-apiserver, etcd
TCPInbound10250Kubelet APISelf, Control plane
TCPInbound10251kube-schedulerSelf
TCPInbound10252kube-controller-managerSelf


2.3 禁用swap虚拟内存(所有节点都要执行)

master node节点都执行本部分操作。

Swap会导致docker的运行不正常,Kubernetes性能下降。

详情开发人员说明:https://github.com/kubernetes/kubernetes/issues/53533

# 临时禁用
[root@master ~] swapoff -a
# 永久禁用
[root@master ~] sed -i.bak '/swap/s/^/#/' /etc/fstab

2.4 内核参数修改

master node节点都执行本部分操作。

本文的k8s网络使用flannel,该网络需要设置内核参数bridge-nf-call-iptables=1 使桥接流量对iptables可见

# 内核参数临时修改
[root@master ~] sysctl net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
[root@master ~] sysctl net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-ip6tables = 1

# 内核参数永久修改
[root@master ~] cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 验证是否生效
[root@master ~] sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

2.5 修改hosts文件

# 根据自己服务器的ip进行修改
[root@master ~] cat >> /etc/hosts << EOF
192.168.214.128    master
192.168.214.129    node01
192.168.214.130    node02
EOF

2.6 设置kubernetes源

master node节点都执行本部分操作。

[root@master ~] 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/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • [] 中括号中的是repository id,唯一,用来标识不同仓库
  • name 仓库名称,自定义
  • baseurl 仓库地址
  • enable 是否启用该仓库,默认为1表示启用
  • gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
  • repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
  • gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了

2.7 更新缓存

[root@master ~] yum clean all
[root@master ~] yum -y makecache

 

三、Docker配置

master node节点都执行本部分操作。

3.1 命令补全 安装bash-completion

# 安装bash-completion
[root@master ~] yum -y install bash-completion
# 加载bash-completion
[root@master ~] source /etc/profile.d/bash_completion.sh

 

3.2 docker镜像加速(已经配置请忽略)

由于Docker Hub的服务器在国外,下载镜像会比较慢,本文以阿里加速镜像配置为例。

3.3 登陆阿里云容器模块获取镜像加速地址

登陆地址为:https://account.aliyun.com 

3.4 配置镜像加速器

配置daemon.json文件

# 镜像地址需修改为自行获取的镜像加速地址
[root@master ~] mkdir -p /etc/docker
[root@master ~] tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://XXXXXX.mirror.aliyuncs.com"]
}
EOF

# 重启docker
[root@master ~] systemctl daemon-reload
[root@master ~] systemctl restart docker

# 查看docker版本信息
[root@master ~] docker --version

 

四、k8s安装

master node节点都执行本部分操作。

4.1 kubelet 版本信息查看

[root@master ~] yum list kubelet --showduplicates | sort -r

 

4.2 安装kubelet、kubeadm和kubectl

[root@master ~] yum install -y kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4

 

  • kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
  • kubeadm 用于初始化集群,启动集群的命令工具
  • kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

4.3 启动kubelet

  启动kubelet并设置开机启动

[root@master ~] systemctl enable kubelet && systemctl start kubelet

 

4.4 kubectl命令补全

[root@master ~] echo "source <(kubectl completion bash)" >> ~/.bash_profile
[root@master ~] source ~/.bash_profile

 

4.5 镜像下载

Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。本文通过运行image.sh脚本方式拉取镜像。

[root@master ~] vim image.sh 
url=registry.aliyuncs.com/google_containers
version=v1.19.4
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done

 

 运行脚本image.sh,下载指定版本的镜像

[root@master ~] chmod 775 image.sh
# 运行脚本
[root@master ~] ./image.sh
# 查看已下载的镜像
[root@master ~] docker images

node节点直接运行启动命令: kubeadm init  无需初始化master

 

五、初始化master

master节点执行本部分操作。

5.1 修改kubelet配置默认cgroup driver

[root@master ~] mkdir -p /var/lib/kubelet/
cat > /var/lib/kubelet/config.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF

# 需要重新启动kubelet
[root@master ~] systemctl restart kubelet

5.2 环境是否正常

[root@master ~] kubeadm init phase preflight

5.3 初始化master 10.244.0.0/16是flannel固定使用的IP段,设置取决于网络组件要求

[root@master ~] kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.19.4

5.4 如初始化失败可执行kubeadm reset 命令来清理环境重新安装

[root@master ~] kubeadm reset
[root@master ~] rm -rf $HOME/.kube/config

5.5 配置master认证

[root@master ~] echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> /etc/profile
[root@master ~] source /etc/profile

5.6 安装flannel网络

 配置hosts

因为国内网络无法解析raw.githubusercontent.com,因此先访问https://tool.chinaz.com/dns/?type=1&host=raw.githubusercontent.com&ip=查看raw.githubusercontent.com的真实IP,并对应修改host

cat >> /etc/hosts << EOF
151.101.108.133    raw.githubusercontent.com
EOF

 在master上新建flannel网络

[root@master ~] kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

 

六、node节点加入集群

6.1 集群节点查看

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   22h   v1.19.4
node01   NotReady <none>   22h   v1.19.4
node02   NotReady <none>   22h   v1.19.4

6.2 node加入集群

需要root权限 (例如 sudo su -

首先在master节点上运行获取 token,discovery-token-ca-cert-hash的值

在Node节点上执行:

kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

# 示例
kubeadm join --token 4xpmwx.nw6psmvn9qi4d3cj 192.168.214.128:6443 --discovery-token-ca-cert-hash sha256:c7cbe95a66092c58b4da3ad20874f0fe2b6d6842d28b2762ffc8d36227d7a0a7

在master节点上运行以下命令来获取token令牌:

[root@master ~] kubeadm token list


# 输出以下内容
TOKEN                    TTL  EXPIRES              USAGES           DESCRIPTION            EXTRA GROUPS
8ewj1p.9r9hcjoqgajrj4gi  23h  2018-06-12T02:51:28Z authentication,  The default bootstrap  system:
                                                   signing          token generated by     bootstrappers:
                                                                    'kubeadm init'.        kubeadm:
                                                                                           default-node-token

默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新token令牌:

[root@master ~] kubeadm token create


# 输出以下内容
5didvk.d09sbcov8ph2amjw

获取 --discovery-token-ca-cert-hash 的值:

[root@master ~] openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'


# 输出以下内容
8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78

如运行kubeadm join --  加入集群命令出现报错:[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

原因:cgroup和systemd有冲突

[root@node01 ~]# docker info | grep Cgroup

 Cgroup Driver: cgroupfs

通过以上命令查到当前的cgroup driver 为cgroupfs,需改为systemd

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl restart docker
[root@node01 ~]# docker info | grep Cgroup         #再次查看cgroup driver 已改为systemd

Cgroup Driver: systemd

# 再次运行加入集群
[root@node01 ~]# kubeadm join 192.168.191.133:6443 --token xvnp3x.pl6i8ikcdoixkaf0 \
    --discovery-token-ca-cert-hash sha256:9f90161043001c0c75fac7d61590734f844ee507526e948f3647d7b9cfc1362d

七、安装Kubernetes Dashboard

Dashboard 只在在master上安装

Kubernetes Dashboard 是 Kubernetes 的官方 Web UI

  • 向 Kubernetes 集群部署容器化应用
  • 诊断容器化应用的问题
  • 管理集群的资源
  • 查看集群上所运行的应用程序
  • 创建、修改Kubernetes 上的资源(例如 Deployment、Job、DaemonSet等)
  • 展示集群上发生的错误

国人开发的Web UI页面: https://kuboard.cn/install/install-dashboard.html 

有兴趣可以了解一下,值得推荐。

7.1 下载yaml

[root@master ~] wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml

Dashboard v2.0.4 兼容性

各版本兼容性参照官方说明:https://github.com/kubernetes/dashboard/releases

Kubernetes version1.161.171.181.19
Compatibility???
  •  完全支持的版本范围。
  • ? 由于Kubernetes API版本之间的重大更改,某些功能在Dashboard中可能无法正常工作。

7.2 修改recommended.yaml配置文件实现外网访问

Dashboard 默认安装只能内网访问,外网访问需要增加 type: NodePort,nodePort: 30001

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  # 修改类型为NodePort外网访问
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      # 设置外网端口为 30001
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard

---

7.3 运行部署:

[root@master ~] kubectl apply -f recommended.yaml

7.4 查看状态:

[root@client ~] kubectl get all -n kubernetes-dashboard 

# 返回以下信息
NAME                                             READY   STATUS              RESTARTS   AGE
pod/dashboard-metrics-scraper-7b59f7d4df-mqfsz   0/1     ContainerCreating   0          10s
pod/kubernetes-dashboard-665f4c5ff-bdhzd         0/1     ContainerCreating   0          10s

NAME                                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
service/dashboard-metrics-scraper   ClusterIP   10.97.201.169   <none>        8000/TCP        10s
service/kubernetes-dashboard        NodePort    10.104.131.77   <none>        443:30001/TCP   10s

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/dashboard-metrics-scraper   0/1     1            0           10s
deployment.apps/kubernetes-dashboard        0/1     1            0           10s

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/dashboard-metrics-scraper-7b59f7d4df   1         1         0       10s
replicaset.apps/kubernetes-dashboard-665f4c5ff         1         1         0       10s

7.5 创建dashboard-admin.yaml文件保存以下信息:

该配置信息dashboard创建新用户,并授予该用户admin权限以及如何使用绑定到该用户的承载令牌登录到Dashboard。

官方文档:https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

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

7.6 运行以下命令:

[root@master ~] kubectl apply -f dashboard-admin.yaml

7.7 获取创建的 admin 账户的令牌token:

生成的token用于登陆Dashboard

[root@master ~] kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

7.8 正常会打印以下内容:

Name:         admin-user-token-v57nw
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 0303243c-4040-4a58-8a47-849ee9ba79c1

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3Vud

7.9 外网访问Dashboard页面

Dashboard 页面访问必须是htts:// 方式访问,如谷歌浏览器等无法访问

请使用火狐浏览器访问:https://192.168.214.128:30001(使用自己服务的公网ip访问)

推荐:如有已配置ssl证书的域名使用nginx反向代理(代理URL:https://127.0.0.1:30001)进行访问

登陆页面

操作面板页面

 

Logo

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

更多推荐