Kubernetes(K8S) 3台服务器安装与测试

 

目录

一、Kubernetes 简介

1.1 Kubernetes 特点

1.2 Kubernetes 版本

1.3 Kubernetes 详解

二、环境介绍

三、安装要求

3.1 主要安装软件及版本 

四、准备工作

4.1 安装必要的rpm软件

4.2 关闭防火墙

4.3 关闭selinux

4.4 禁用交换分区

4.5 配置域名解析

4.6 修改内核参数

4.7 配置yum源

五、安装 Docker

5.1 安装docker

六、安装 kubernetes

6.1 添加 Kubernetes 阿里云 yum 源

6.2 安装 kubeadm、kubelet 和 kubectl

6.3 部署Kubernetes Master节点

6.4 安装 Pod 网络插件(CNI)

6.5 部署 Kubernetes Node 节点

6.6 测试 kubernetes 集群

6.7 Dashboard 安装(Kubernetes Web UI 界面)

6.8 使用 Token 登陆 Dashboard

七、参考资料


 

一、Kubernetes 简介

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

通过Kubernetes你可以:

快速部署应用、

快速扩展应用、

无缝对接新的应用功能、

节省资源,优化硬件资源的使用。

1.1 Kubernetes 特点

可移植: 支持公有云,私有云,混合云,多重云(multi-cloud);

可扩展: 模块化,插件化,可挂载,可组合;

自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展。

1.2 Kubernetes 版本

官网地址:kubernetes.io(外网,近期连接很慢,甚至连接不上,查阅资料很不方便)。

目前官网最新版本是:v1.18.0-beta.1,18 版还没有出正式版。正式版里最新版本为 v1.17.3,支持的系统版本至少是 Centos 7.6。笔者拿到的测试环境系统是 Centos 7.5,所以选择安装的是稳定版:kubernetes v1.15.0

1.3 Kubernetes 详解

目前官网了解途径不顺利,因此找了两个网址做详细了解:

Kubernetes(k8s)|中文文档    http://docs.kubernetes.org.cn/227.html

kubernetes简介    https://blog.51cto.com/12974849/2476138

二、环境介绍

操作系统:Centos 7.5.1804

服务器:3

主机名 IP 地址 操作系统 主机角色
k8s1 10.0.0.176 CentOS 7.5.1804 k8s-master
k8s2 10.0.0.177 CentOS 7.5.1804 k8s-node
k8s3 10.0.0.178 CentOS 7.5.1804 k8s-node

三、安装要求

在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:

· 一台或多台机器,操作系统 CentOS7.x-86_x64

· 硬件配置:内存 2GB+ ,2 核 CPU+(实验环境配置稍低也可以)

· 集群中所有机器之间网络互通

· 可以访问外网,需要拉取镜像

· 禁止 swap 分区

3.1 主要安装软件及版本 

Docker: 18.06.1-ce

Kubelet: v1.15.0

Kubectl: v1.15.0

Kubeadm: v1.15.0

四、准备工作

      所有的节点都进行配置。

4.1 安装必要的rpm软件

## 安装wget vim net-tools epel-release
yum install -y wget vim net-tools epel-release

## 安装 nfs-utils
## 必须先安装 nfs-utils 才能挂载 nfs 网络存储
yum install -y nfs-utils

4.2 关闭防火墙

systemctl disable firewalld

systemctl stop firewalld

4.3 关闭selinux

setenforce 0

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

4.4 禁用交换分区

swapoff -a

# 如需要永久禁用(可选),打开/etc/fstab注释掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab

4.5 配置域名解析

# 修改 /etc/hosts
cat <> /etc/hosts
10.0.0.176 k8s1
10.0.0.177 k8s2
10.0.0.178 k8s3
EOF

4.6 修改内核参数

# 将桥接的IPv4流量传递到iptables的链
cat <  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

4.7 配置yum

## 配置默认源
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 下载阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

#  更新缓存
yum clean all
yum makecache fast

五、安装 Docker

Docker 版本众多,但为了适配 Kubernetes v1.15.0,本次安装选择的是:18.06.1-ce

        所有的节点都进行配置。

5.1 安装docker

如果已经安装了docker,可先卸载,具体步骤参考:

https://www.jianshu.com/p/ef3a041031d2

下载 docker 的 yum 源文件,

# 安装依赖
yum -y install yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

这里可以先查看支持的版本,本文安装指定docker版本,

yum list docker-ce --showduplicates | sort -r 

 * updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
 * extras: mirrors.aliyun.com
 * epel: hkg.mirror.rackspace.com
docker-ce.x86_64         3:19.03.2-3.el7       docker-ce-stable
docker-ce.x86_64         3:19.03.1-3.el7       docker-ce-stable
docker-ce.x86_64         3:19.03.0-3.el7       docker-ce-stable
docker-ce.x86_64         3:18.09.9-3.el7       docker-ce-stable
...
...
...
 * base: mirrors.aliyun.com

目前最新版本为 19.03.7-3.el7,本次安装指定版本 18.06.1-ce,

yum -y install docker-ce-18.06.1.ce-3.el7   # 要指定该版本安装

# 设置开机启动
systemctl enable docker

# 启动 docker
systemctl start docker

查看 docker 是否已成功安装并启动,

# 查看版本
docker --version

Docker version 18.06.1-ce, build e68fc7a

# 查看docker服务
systemctl status docker

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-03-12 01:01:20 CST; 12min ago
     Docs: https://docs.docker.com
 Main PID: 17443 (dockerd)
...

docker 打印 hello-world,

# docker run hello-world

Hello from Docker

This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
...

# docker 安装完成后测试hello-world出现问题(Unable to find image 'hello-world:latest' locally

docker 在本地没有找到 hello-world 镜像,也没有从 docker 仓库中拉取镜像,出现这个问题的原因:docker 服务器在国外,在国内无法正常拉取镜像,所以就需要为 docker 设置阿里云的镜像加速器。

需要修改配置文件,

vim /etc/docker/daemon.json  # 如果没有就创建

{
   "registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"]
}

保存并退出,并且重启docker服务,

systemctl restart docker

docker重启之后,就可以正常拉取 helloworld 镜像了。

六、安装 kubernetes

        6.16.2 步骤三台服务器都配置。

6.1 添加 Kubernetes 阿里云 yum 源

# [] 中括号中的是repository id,唯一,用来标识不同仓库
# name 仓库名称,自定义
# baseurl 仓库地址
# enable 是否启用该仓库,默认为1表示启用
# gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
# repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
# gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了

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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 更新缓存
yum clean all
yum makecache fast

6.2 安装 kubeadm、kubelet 和 kubectl

本文安装版本 v1.15.0,安装时指定版本号:

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

# 设置开机启动,这里暂不启动kubelet
systemctl enable kubelet

6.3 部署Kubernetes Master节点

         只在master节点配置。

kubeadm init \
  --apiserver-advertise-address=10.0.0.176  \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.15.0 \
  --service-cidr=10.1.0.0/16 \
  --pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址 k8s.gcr.io 现阶段国内无法访问,这里指定阿里云镜像仓库地址。

备注:记得修改主机 IP 地址、kubernetes 版本。

初始化完成,页面最下面会生成 token,记得复制下来,一会后面要用到。

kubeadm join 10.0.0.176:6443 --token mksask.1xn58bt51daiqbf1 \
    --discovery-token-ca-cert-hash sha256:52e27adaf2747ec921f8203960aea316adc40fe75684ca047392d73d41bcda27

使用 kubectl 工具,执行: (备注:仅master上面执行)

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

查看 .kube 目录,会在根目录下面生成 config 文件,

ls .kube/
cache  config  http-cache

查看节点状态,

kubectl get node

NAME                  STATUS     ROLES      AGE   VERSION
k8s1-mathartsys-com   NotReady   master     11m   v1.15.0

##  这是正常的。因为没有安装容器网络(Pod),所以是没有准备好的状态。

6.4 安装 Pod 网络插件(CNI)

         只在master节点配置。

## 下载kube-flannel.yml源
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

## 修改镜像地址
sed -i 's/quay.io\/coreos/registry.cn-beijing.aliyuncs.com\/imcto/g' kube-flannel.yml

## 运行kube-flannel.yml文件
kubectl apply -f kube-flannel.yml

6.5 部署 Kubernetes Node 节点

向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令:

## 2个节点上执行

kubeadm join 10.0.0.176:6443 --token mksask.1xn58bt51daiqbf1 \
    --discovery-token-ca-cert-hash sha256:52e27adaf2747ec921f8203960aea316adc40fe75684ca047392d73d41bcda27

6.6 测试 kubernetes 集群

在 Kubernetes 集群中创建一个 pod,验证是否正常运行:

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-554b9c67f9-zz6kr   1/1     Running   0          39h

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service/kubernetes  ClusterIP   10.1.0.1             443/TCP        46h
service/nginx       NodePort    10.1.41.17           80:31547/TCP   39h

访问地址:http://NodeIP:Port(本次安装对应地址:http://10.0.0.176:31547

Kubernetes(K8S) 3台服务器安装与测试_第1张图片

 

6.7 Dashboard 安装(Kubernetes Web UI 界面)

         在master节点进行执行。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

下载kubernetes-dashboard.yaml

wget  https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

默认镜像国内无法访问,修改镜像地址为: lizhenliang/kubernetes-dashboard-amd64:v1.10.1。

另外,默认 Dashboard 只能集群内部访问,需要修改 Service 为 NodePort 类型(暴露给外部)并添加端口 nodePort: 30001,这样才能访问。

## 修改kubernetes-dashboard.yaml文件(注释出 #...)
vi kubernetes-dashboard.yaml

# ------------------- Dashboard Deployment ------------------- #
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
      - name: kubernetes-dashboard
#        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
        image: lizhenliang/kubernetes-dashboard-amd64:v1.10.1

# ------------------- Dashboard Service ------------------- #
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  # 新加 type:NodePort
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      # 新加 nodePort: 30001
      nodePort: 30001
  selector:
k8s-app: kubernetes-dashboard
## 运行kubernetes-dashboard.yaml文件
kubectl apply -f kubernetes-dashboard.yaml

secret/kubernetes-dashboard-certs unchanged
serviceaccount/kubernetes-dashboard unchanged
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal unchanged
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal unchanged
deployment.apps/kubernetes-dashboard configured
service/kubernetes-dashboard configured

所有节点拉取镜像,

docker pull lizhenliang/kubernetes-dashboard-amd64:v1.10.1

等待镜像拉取完后,master 节点检查状态

kubectl get pods -n kube-system

NAME                                          	READY   STATUS    RESTARTS   AGE
calico-kube-controllers-7b4657785d-q4vzg    	1/1     Running   0          40h
calico-node-27s72                             	1/1     Running   0          40h
calico-node-nrzbf                             	1/1     Running   0          40h
calico-node-x7w9j                             	1/1     Running   0          40h
coredns-bccdc95cf-lk5h2                      	1/1     Running   0          46h
coredns-bccdc95cf-sx4vm                      	1/1     Running   0          46h
etcd-k8s1-mathartsys-com                     	1/1     Running   0          46h
kube-apiserver-k8s1-mathartsys-com              1/1     Running   0          46h
kube-controller-manager-k8s1-mathartsys-com     1/1     Running   0          46h
kube-flannel-ds-amd64-5xblm                     1/1     Running   0          41h
kube-flannel-ds-amd64-c42b2                     1/1     Running   0          40h
kube-flannel-ds-amd64-dtklt                     1/1     Running   0          40h
kube-proxy-2dtdh                           	    1/1     Running   0          46h
kube-proxy-gvkwq                              	1/1     Running   0          40h
kube-proxy-x7v4z                             	1/1     Running   0          40h
kube-scheduler-k8s1-mathartsys-com          	1/1     Running   0          46h
kubernetes-dashboard-79ddd5-9zgln           	1/1     Running   0          30h

如果镜像拉取失败或没拉取完,会有服务显示 ImagePullBackOff 或 Pending 或 Init 状态:

NAME 										READY 	STATUS 		RESTARTS 	AGE
coredns-8686dcc4fd-hldfb 					1/1 	Pending 	0 			120m
coredns-8686dcc4fd-tnxhp 					1/1 	Pending 	0 			120m
kube-scheduler-k8s1-mathartsys-com       0/1     ImagePullBackOff 	0   46h
kubernetes-dashboard-79ddd5-9zgln      	0/1     ImagePullBackOff 	0   30h
...

创建 service account 并绑定默认 cluster-admin 管理员集群角色(仅在master上面操作),

kubectl create serviceaccount dashboard-admin -n kube-system

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

拷贝输出的Token,下一步使用 Token 登陆 Dashboard

token:
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdjdyd3ciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZjcyNjE1MDktYjFiNS00YTE0LWE1ODctMTZmMjc2OGNjOGY1Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.fdhlU0xDJ60sz8lXzuimPGL_Dz6lePrgh9ORZLW-SWBsCq2cTTkKGKfjDmu2cwmbunkO4AU9ZLIzHmR-7LYTS6hzJNSpT_ZCuKEwuZs4IdMwlHqQlVbN9jlMf5TsDxU6WU2BzxCytXBpgKbJGbfbEHnZmBPVsKUjuTFvgPKVPM3BsUKdva0LLxKTa4F5dm2yNX6N0wNXzFCPrj_tcJnmghRvnOoUAvW2cpy8Z2ARpMx0ZauhD5tpIrm7tmSDlxPMj_0RDX8BykrIiR5Ic8evcTmYdidPnzPKgQ5iPCptE6ZIhwQhJQjzuNNU6zPu58Ynfhroh75T9yOgWCaqLFE08w

也可以查看 Token:

kubectl describe secrets -n kube-system dashboard-admin

6.8 使用 Token 登陆 Dashboard

Dashboard提供了可以实现集群管理、工作负载、服务发现和负载均衡、存储、字典配置、日志视图等功能。

本次登陆使用浏览器:谷歌浏览器

访问地址:https://NodeIP:30001https://10.0.0.176:30001

访问该地址时,报错:NET::ERR_CERT_INVALID

Kubernetes(K8S) 3台服务器安装与测试_第2张图片

解决办法:https://blog.51cto.com/mapengfei/2476429

在当前页面打开的时候点网页任意地方,不是在输入框,不是在输入框,不是在输入框,在 chrome 该页面上,直接键盘敲入这11个字符:thisisunsafe (鼠标点击当前页面任意位置,让页面处于最上层即可输入)

Kubernetes(K8S) 3台服务器安装与测试_第3张图片

选择Token登陆,输入上面拷贝的Token,登入Dashboard。

Kubernetes(K8S) 3台服务器安装与测试_第4张图片

至此,已经安装好k8s。

 

如果 Token 没有拷贝,可以查找:

kubectl describe secrets -n kube-system dashboard-admin

七、参考资料

1. 部署 k8s Web UI

https://edu.51cto.com/center/course/lesson/index?id=426979

2. 使用 Kubeadm 快速部署一个 k8s 集群

https://www.cnblogs.com/nulige/articles/10941218.html

3. 快速部署一个 Kubernetes 集群

https://blog.51cto.com/11971822/2476364

4. CentOS7 利用 kubeadm 快速部署 k8s 集群

https://blog.51cto.com/innocence/2433112?source=dra

5. kubeadm 安装 k8s

https://www.cnblogs.com/Vivi-87/p/11169177.html

6. centos 7 安装 kubernetes

https://www.cnblogs.com/zhuzi91/p/12357971.html

 

以上资料只是参考,最好提前了解 kubernetes 的基本概念,自己动手搭建 k8s 集群,如遇问题,多去搜索查阅资料。以上也只是入门,笔者也是初识 K8S。

你可能感兴趣的:(Kubernetes(K8S) 3台服务器安装与测试)