首页 运维干货kubernetes二进制部署单master节点

kubernetes二进制部署单master节点

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

1、安装要求

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

  • 三台机器,操作系统 CentOS7.7(mini)
  • 硬件配置:2GBRAM,2vCPU+,硬盘30GB+
  • 集群中所有机器之间网络互通,且可访问外网。
  • 采用NAT网络模型(依自己情况而定)

2、安装规划

(1)服务器规划

角色 IP
master 192.168.50.128
node0 192.168.50.128
node1 192.168.50.131
node2 192.168.50.132

(2)软件环境

软件 版本
Docker 19.03.12
kubernetes 1.18.6
etcd 3.4.9

(3)软件规划

主机 安装组件
master kube-apiserver,kube-controller-manager,kube-scheduler,etcd
node1 kubelet,kube-proxy,etcd
node2 kubelet,kube-proxy,etcd

3、初始化系统

3.1、分步骤操作

(1)配置主机名

master节点设置:

~]# hostnamectl set-hostname master

node1从节点设置:

~]# hostnamectl set-hostname node1

node2从节点设置:

~]# hostnamectl set-hostname node2

根据自己的节点命名情况来设置即可。

(2)添加hosts

所有的节点都要添加hosts解析记录

~]# cat >>/etc/hosts < /etc/sysctl.d/k8s.conf < /etc/sysctl.d/k8s.conf < ca-config.json < ca-csr.json < gencert:生成新的key(密钥)和签名证书
>
> --initca:初始化一个新ca

### 4.3、使用自签CA签发`Etcd`证书

#### (1)创建`Etcd`证书签名请求文件

```bash
[root@master etcd]# cat > server-csr.json << EOF
{
    "CN": "etcd",
    "hosts": [
    "192.168.50.128",
    "192.168.50.131",
    "192.168.50.132"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF

hosts字段中IP为所有etcd节点的集群内部通信IP,有几个etcd节点,就写多少个IP。当然,为方便后期扩容可以多些几个预留的IP。

(2)生成证书

[root@master etcd]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
[root@master etcd]# ls -l server*.pem
-rw------- 1 root root 1679 Jul 14 10:18 server-key.pem
-rw-r--r-- 1 root root 1383 Jul 14 10:18 server.pem

gencert: 生成新的key(密钥)和签名证书
-initca:初始化一个新ca
-ca:指明ca的证书
-ca-key:指明ca的私钥文件
config:指明请求证书的json文件
-profile:与config中的profile对应,是指根据config中的profile段来生成证书的相关信息

(3)证书分发至其他etcd服务器

将前面两步创建的证书都分发给其他etcd节点。

写一个shell脚本,先在目标主机创建存放etcd证书的目录,接着复制证书

#!/bin/bash

for node in master node1 node2
do
    ssh root@${node} "mkdir -pv /etc/etcd/ssl"
    scp ~/TLS/etcd/ca*.pem  root@${node}:/etc/etcd/ssl
    scp ~/TLS/etcd/server*.pem  root@${node}:/etc/etcd/ssl
done

补充:事实上只需要分发ca.pem公钥即可,ca-key.pem是私钥,很多组件不需要,除非你确保使用它,你才分发到服务器上面,以免造成私钥泄露。不过我们不需要考虑太多,所以把私钥也分发到了服务器上面。

4.4、部署Etcd集群

以下在节点1操作,部署完成后,将节点1生成的所有的文件拷贝到节点2和节点3

(1)解压Etcd包并拷贝二进制执行程序

[root@master etcd]# cd 
[root@master ~]# tar xf etcd-v3.4.9-linux-amd64.tar.gz
[root@master ~]# cp -a etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /usr/local/bin

(2)创建Etcd配置文件

[root@master ~]# mkdir -pv /etc/etcd/cfg
[root@master ~]# cat >/etc/etcd/cfg/etcd.conf < /usr/lib/systemd/system/etcd.service < 所有node节点都部署docker服务

#### (1)添加docker软件yum源

方法:浏览器打开`mirrors.aliyun.com`网站,找到docker-ce,即可看到镜像仓库yum源
![](https://img-blog.csdnimg.cn/20200919094316485.png)

```bash
~]# curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
~]# cat /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
...
...

写个脚本执行方便

for i in master node1 node2; do ssh root@$i "curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo";done

(2)安装docker-ce组件

列出所有可以安装的版本

~]# dnf list docker-ce --showduplicates
docker-ce.x86_64       3:18.09.6-3.el7               docker-ce-stable
docker-ce.x86_64       3:18.09.7-3.el7               docker-ce-stable
docker-ce.x86_64       3:18.09.8-3.el7               docker-ce-stable
docker-ce.x86_64       3:18.09.9-3.el7               docker-ce-stable
docker-ce.x86_64       3:19.03.0-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.2-3.el7               docker-ce-stable
docker-ce.x86_64       3:19.03.3-3.el7               docker-ce-stable
docker-ce.x86_64       3:19.03.4-3.el7               docker-ce-stable
docker-ce.x86_64       3:19.03.5-3.el7               docker-ce-stable
.....

这里我们安装18.09版本的docker-ce

~]# dnf install -y  docker-ce-18.09.9 docker-ce-cli-18.09.9

(3)启动docker并设置开机自启动

~]# systemctl enable --now docker

查看版本号,检测docker是否安装成功

~]# docker --version
Docker version 18.09.9, build 039a7df9ba

上面的这种查看docker client的版本的。建议使用下面这种方法查看docker-ce版本号,这种方法把docker的client端和server端的版本号查看的一清二楚。

~]# docker version
Client:
 Version:           18.09.9
 API version:       1.39
 Go version:        go1.11.13
 Git commit:        039a7df9ba
 Built:             Wed Sep  4 16:51:21 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.9
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.11.13
  Git commit:       039a7df
  Built:            Wed Sep  4 16:22:32 2019
  OS/Arch:          linux/amd64
  Experimental:     false

(4)更换docker的镜像仓库地址

默认的镜像仓库地址是docker官方的,国内访问异常缓慢,因此更换为个人阿里云的源。

~]# cat > /etc/docker/daemon.json < ca-config.json < ca-csr.json < 只需要下载一个server包就够了,包含了Master和Worker Node二进制文件

详情介绍:`https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md`

下载链接:`https://dl.k8s.io/v1.18.4/kubernetes-server-linux-amd64.tar.gz`

- ##### 国内下载

考虑到科学上网问题,因此给大家介绍一个链接:`https://storage.googleapis.com/kubernetes-release/release/v1.18.4/kubernetes-server-linux-amd64.tar.gz`

#### (1)创建目录并解压二进制包

> kubernetes证书路径是`/etc/kubernetes/ssl`
>
> 配置文件路径是`/etc/kubernetes/cfg`
>
> 二进制可执行程序包直接放在环境变量`/usr/local/bin`
>
> 日志路径是`/var/log/kubernetes`

```bash
[root@master k8s]# cd && mkdir -pv /etc/kubernetes/cfg /var/log/kubernetes
[root@master ~]# tar xf kubernetes-server-linux-amd64.tar.gz
[root@master ~]# cd kubernetes/server/bin && cp kube-apiserver kube-scheduler kube-controller-manager kubectl /usr/local/bin

(2)部署kube-apiserver

创建kube-apiserver配置文件

[root@master ~]# cat > /etc/kubernetes/cfg/kube-apiserver.conf <为了使用EOF保留换行符,所以要写两个`\\`

配置文件详细解释如下:

| 配置选项                                   | 选项说明                                                     |
| ------------------------------------------ | :----------------------------------------------------------- |
| `--logtostderr=false `                     | 输出日志到文件中(文件路径由`--log-dir`指定),不输出到标准错误控制台 |
| `--v=2`                                    | 指定输出日志的级别                                           |
| `--advertise-address`                      | 向集群成员通知 apiserver 消息的 IP 地址,这个地址必须能够被集群中其他成员访问,如果 IP 地址为空,将会使用 `--bind-address`,如果未指定` --bind-address`,将会使用主机的默认接口地址 |
| `--etcd-servers`                           | 连接的 etcd 服务器列表 , 形式为(`scheme://ip:port`),使用逗号分隔 |
| `--etcd-cafile`                            | 用于etcd 通信的 SSL CA 文件                                  |
| `--etcd-certfile`                          | 用于 etcd 通信的的 SSL 证书文件                              |
| `--etcd-keyfile`                           | 用于 etcd 通信的 SSL 密钥文件                                |
| `--service-cluster-ip-range`               | Service网络地址分配 ,CIDR 表示的 IP 范围,服务的 cluster ip 将从中分配, 一定不要和分配给 nodes 和 pods 的 IP 范围产生重叠 |
| `--bind-address`                           | 监听 --seure-port 的 IP 地址,被关联的接口必须能够被集群其它节点和 CLI/web 客户端访问,如果为空,则将使用所有接口(`0.0.0.0`) |
| `--secure-port=6443`                       | 用于监听具有认证授权功能的 HTTPS 协议的端口,默认值是6443    |
| `--allow-privileged`                       | 是否启用授权功能                                             |
| --service-node-port-range                  | Service使用的端口范围                                        |
| `--default-not-ready-toleration-seconds`   | 表示 notReady状态的容忍度秒数                                |
| `--default-unreachable-toleration-seconds` | 表示 unreachable状态的容忍度秒数:                           |
| `--max-mutating-requests-inflight=2000`    | 在给定时间内进行中可变请求的最大数量,当超过该值时,服务将拒绝所有请求,0 值表示没有限制(默认值 200) |
| `--default-watch-cache-size=200`           | 默认监视缓存大小,0 表示对于没有设置默认监视大小的资源,将禁用监视缓存 |
| `--delete-collection-workers=2 `           | 用于 DeleteCollection 调用的工作者数量,这被用于加速 namespace 的清理( 默认值 1) |
| `--enable-admission-plugins`               | 资源限制的相关配置                                           |
| `--authorization-mode`                     | 在安全端口上进行权限验证的插件的顺序列表,以逗号分隔的列表,包括:AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node.(默认值 "AlwaysAllow") |
| `--enable-bootstrap-token-auth`            | 启用此选项以允许 'kube-system' 命名空间中的` 'bootstrap.kubernetes.io/token'` 类型密钥可以被用于 TLS 的启动认证 |
| `--token-auth-file`                        | 声明bootstrap token文件                                      |
| `--kubelet-certificate-authority`          | 证书 authority 的文件路径                                    |
| `--kubelet-client-certificate`             | 用于 TLS 的客户端证书文件路径                                |
| `--kubelet-client-key`                     | 用于 TLS 的客户端证书密钥文件路径                            |
| `--tls-private-key-file`                   | 包含匹配`--tls-cert-file `的 x509 证书私钥的文件             |
| --service-account-key-file                 | 包含 PEM 加密的 x509 RSA 或 ECDSA 私钥或公钥的文件,用于验证 ServiceAccount 令牌,如果设置该值,--tls-private-key-file 将会被使用,指定的文件可以包含多个密钥,并且这个标志可以和不同的文件一起多次使用 |
| `--audit-log-maxage`                       | 基于文件名中的时间戳,旧审计日志文件的最长保留天数           |
| `--audit-log-maxbackup`                    | 旧审计日志文件的最大保留个数                                 |
| `--audit-log-maxsize`                      | 审计日志被轮转前的最大兆字节数                               |
| `--audit-log-path`                         | 如果设置,表示所有到apiserver的请求都会记录到这个文件中,‘-’表示写入标准输出 |

#### (3)启用`TLS Bootstrapping`机制

> 当集群开启了 TLS 认证后,每个节点的 kubelet 组件都要使用由 apiserver 使用的 CA 签发的有效证书才能与 apiserver 通讯;此时如果节点多起来,为每个节点单独签署证书将是一件非常繁琐的事情;
>
> TLS bootstrapping 功能就是让 node节点上的kubelet组件先使用一个预定的低权限用户连接到 apiserver,然后向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署;

- ##### 生成token值

```bash
[root@localhost ~]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
14f2afa0b6ccc53350972c4d2942d452
  • ##### 生成token文件:
[root@master ~]# cat > /etc/kubernetes/ssl/token.csv < /usr/lib/systemd/system/kube-apiserver.service <上面的变量引用符号`$`前面加上转义符`\`,这是在使用EOF写入文件需要注意的地方。

#### (5)启动并设置开机启动

```bash
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start kube-apiserver
[root@master ~]# systemctl enable kube-apiserver

(6)授权kubelet-bootstrap用户允许请求证书

[root@master ~]# kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap

clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap created

6.4、部署kube-controller-manager

kube-controller-manager(k8s控制器管理器)是一个守护进程,它通过kube-apiserver监视集群的共享状态(kube-apiserver收集或监视到的一些集群资源状态,供kube-controller-manager或其它客户端watch), 控制器管理器并尝试将当前的状态向所定义的状态迁移(移动、靠近),它本身是有状态的,会修改集群状态信息,如果多个控制器管理器同时生效,则会有一致性问题,所以kube-controller-manager的高可用,只能是主备模式,而kubernetes集群是采用租赁锁实现leader选举,需要在启动参数中加入 --leader-elect=true

(1)创建controller-manager配置文件

[root@master ~]# cat > /etc/kubernetes/cfg/kube-controller-manager.conf < /usr/lib/systemd/system/kube-controller-manager.service <调度器的职责主要是为新创建的pod在集群中寻找最合适的node,并将pod调度到Node上,Scheduler调度器运行在master节点,它的核心功能是监听apiserver来获取节点上为空的pod,然后为pod创建一个binding指示pod应该调度到哪个节点上,调度结果写入apiserver。

#### (1)创建`scheduler`配置文件

```bash
[root@master ~]# cat > /etc/kubernetes/cfg/kube-scheduler.conf < /usr/lib/systemd/system/kube-scheduler.service < 对于我们这里的二进制部署的一主多从,在企业中适合测试环境,因此为了更多的复用机器资源,主master节点也应该作为node节点跑pod。

**下面依然在master这个节点上操作,让其再成为节点**

### 7.1、拷贝二进制文件至node0节点

- 复制二进制包

将kubernetes解压的二进制包程序`kubelet,kube-proxy`复制到本地环境变量路径下。

````bash
[root@master ~]# cd kubernetes/server/bin
[root@master bin]# cp kubelet kube-proxy /usr/local/bin
[root@master bin]# cd
````

### 7.2、部署kubelet服务

#### (1)创建`kubelet.conf`配置文件

```bash
[root@master ~]# cat > /etc/kubernetes/cfg/kubelet.conf < /etc/kubernetes/cfg/kubelet-config.yml < /usr/lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service

[Service]
EnvironmentFile=/etc/kubernetes/cfg/kubelet.conf
ExecStart=/usr/local/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
RestartSec=10
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

(5)启动并设置开机启动

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start kubelet
[root@master ~]# systemctl enable kubelet

(6)部署CNI容器网络

CNI,全名叫做:容器网络接口。是CNCF旗下的一个项目,由一组用于配置容器的网络接口的规范和库组成。CNI主要用于解决容器网络互联的配置并支持多种网络模型。

[root@master ~]# cd ~
[root@master ~]#  wget https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
[root@master ~]# mkdir -pv /opt/cni/bin
[root@master ~]# tar xf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
[root@master ~]# ls /opt/cni/bin
bandwidth  bridge  dhcp  firewall  flannel  host-device  host-local  ipvlan  loopback  macvlan  portmap  ptp  sbr  static  tuning  vlan

7.3、批准kubelet证书申请并加入集群

(1)查看kubelet证书请求

[root@master ~]# kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-N6eV-2UjPO6-dv67Co_lM9BGyF-BQGQ1R_rJz0rGQ3A   22m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending

此命令可以看到所有请求,所有为pending状态,则是需要批准的。

(2)批准申请

把上面的命令的NAME字段的值拿过来。

[root@master ~]# kubectl certificate approve `kubectl get csr | grep "Pending" | awk '{print $1}'`
certificatesigningrequest.certificates.k8s.io/node-csr-N6eV-2UjPO6-dv67Co_lM9BGyF-BQGQ1R_rJz0rGQ3A approved
  • 查看节点
[root@master ~]# kubectl get node
NAME    STATUS     ROLES    AGE   VERSION
node0   NotReady      3s    v1.18.4

注意:这里的STATUS状态值还是notReady,是因为网络插件还没有部署好。接着往下即可。

7.4、部署kube-proxy服务

kube-proxy是什么,这里就不得不提前说下service,service是一组Pod的抽象集合,它相当于一组Pod的负载均衡器,负责将请求分发到对应的pod,kube-proxy就是负责service的实现的,当请求到达service时,它通过label关联到后端并转发到某个Pod;kube-proxy提供了三种负载均衡模式:用户空间、iptables、ipvs,我们采用的是iptables负载均衡模式。

(1)创建kube-proxy配置文件

[root@master ~]# cat > /etc/kubernetes/cfg/kube-proxy.conf < /etc/kubernetes/cfg/kube-proxy-config.yml < kube-proxy-csr.json < kube-proxy是作为kube-apiserver的客户端,由于我们启用了TLS,所以需要认证访问,这里我们需要使用到之前生成的证书。

```bash
[root@master k8s]# kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=https://192.168.50.128:6443 \
  --kubeconfig=kube-proxy.kubeconfig
[root@master k8s]# kubectl config set-credentials kube-proxy \
  --client-certificate=./kube-proxy.pem \
  --client-key=./kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig
[root@master k8s]# kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig
[root@master k8s]# kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

拷贝到配置文件指定的路径下:

[root@master k8s]# cp kube-proxy.kubeconfig /etc/kubernetes/cfg/

(5)创建kube-proxy服务启动脚本

[root@master k8s]# cat > /usr/lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target

[Service]
EnvironmentFile=/etc/kubernetes/cfg/kube-proxy.conf
ExecStart=/usr/local/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
RestartSec=10
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

(6)启动并设置开机启动

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start kube-proxy
[root@master ~]# systemctl enable kube-proxy

7.5、授权apiserver访问kubelet

在执行kubectl exec、run、logs 等命令时,apiserver会转发到kubelet。这里定义 RBAC规则,授权apiserver调用kubelet API”

[root@master ~]# cat > apiserver-to-kubelet-rbac.yaml < ​   Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。
>     Flannel通过给每台宿主机分配一个子网的方式为容器提供虚拟网络,它基于`Linux TUN/TAP`,使用UDP封装IP包来创建overlay网络,并借助etcd维护网络的分配情况

#### (1)下载flannel配置文件

```bash
[root@master ~]# curl -o kube-flannel.yml  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

事实上很多用户都不能成功,因为国内网络受限,所以可以这样子来做。
修改hosts文件,加上如下解析记录

 199.232.28.133  raw.githubusercontent.com

(2)更换flannel镜像源

编辑镜像源,默认的镜像地址我们修改一下。把yaml文件中所有的quay.io修改为 quay-mirror.qiniu.com

[root@master ~]# sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml

此时保存保存退出。在master节点执行此命令。

[root@master ~]# kubectl apply -f kube-flannel.yml 
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created

这样子就可以成功拉取flannel镜像了。当然你也可以直接使用我提供给大家的kube-flannel.yml文件

  • 查看flannel是否正常

如果你想查看flannel这些pod运行是否正常,使用如下命令:

[root@master ~]# kubectl get pods -n kube-system
NAME                          READY   STATUS    RESTARTS   AGE
kube-flannel-ds-amd64-n5z2w   1/1     Running   0          2m6s

注意:稍等1-3分钟后,如果第三字段STATUS不是处于Running状态的话,并且STATUS字段数值一直在渐渐变大,说明flannel是异常的,需要排查问题所在。

  • 查看节点
[root@master ~]# kubectl get nodes
NAME    STATUS   ROLES    AGE   VERSION
node0   Ready       10m   v1.18.4

目前节点状态是Ready,表示集群节点现在是可用的

(3)无法拉取镜像解决方法

如果有以下报错:

Normal   BackOff    24m (x6 over 26m)   kubelet, master3   Back-off pulling image "quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64"
  Warning  Failed     11m (x64 over 26m)  kubelet, master3   Error: ImagePullBackOff

或者是

Error response from daemon: Get https://quay.io/v2/: net/http: TLS handshake timeout

上面的这些都表示是网络问题不能拉取镜像,我这里给大家提前准备了flannel的镜像。导入一下就可以了。

[root@master1 ~]# docker load -i flannel.tar

7.7、部署CoreDNS解析插件

CoreDNS用于集群中Pod解析Service的名字,Kubernetes基于CoreDNS用于服务发现功能。

安装CoreDNS1.6.7(目前较新版本)。如果之前修改了PodIP的网段,那么这里需要自行修改此文件的ClusterIP参数。其他可保持不变

“`bash
spec:
selector:
k8s-app: kube-dns
clusterIP: 10.0.0.2 #根据自己情况修改此值

<pre><code class="line-numbers">#### (1)构建CoreDNS

“`bash
[root@master ~]# kubectl apply -f coredns.yaml

查看Pod状态

[root@master ~]# kubectl -n kube-system get pod | grep coredns
coredns-64d575f97f-52kjv      1/1     Running   0          2d5h

(2)解析测试

kubectl run -it --rm busybox-dns --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.

/ # nslookup kubernetes
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

只要能出结果,解析就是没有问题的。

8、继续增加worker node

8.1、部署第二个node节点

(1)拷贝部署好的node相关文件到新节点

在master节点操作,把文件远程复制给node节点

[root@master ~]# scp -p /usr/local/bin/{kubelet,kube-proxy} root@node1:/usr/local/bin
[root@master ~]# scp -pr /etc/kubernetes root@node1:/etc
[root@master ~]# scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@node1:/usr/lib/systemd/system
[root@master ~]# scp -pr /opt/cni root@node1:/opt

(2)删除kubelet证书和kubeconfig

在node1节点上操作

[root@node1 ~]# rm -rf /etc/kubernetes/cfg/kubelet.kubeconfig
[root@node1 ~]# rm -rf /etc/kubernetes/ssl/kubelet*

(3)修改主机名

[root@node1 ~]# vim /etc/kubernetes/cfg/kubelet.conf

修改为--hostname-override-=node1

[root@node1 ~]# vim /etc/kubernetes/cfg/kube-proxy-config.yml

修改为hostnameOverride: node1

(4)启动并设置开机启动

[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable --now kubelet kube-proxy

(5)批准node节点申请

下面的是在master节点操作的

[root@master ~]# kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-N6eV-2UjPO6-dv67Co_lM9BGyF-BQGQ1R_rJz0rGQ3A   41m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
node-csr-hJkIg6lFyeDTORq2Y_xNS7qsU0kQCQh_ZqL0Zj_rfrE   98s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending

上面的CONDITIONPending状态的表示将要被加入集群的节点。所以记录前面的NAME字段

[root@master ~]# kubectl certificate approve `kubectl get csr | grep Pending| awk '{print $1}'`
certificatesigningrequest.certificates.k8s.io/node-csr-hJkIg6lFyeDTORq2Y_xNS7qsU0kQCQh_ZqL0Zj_rfrE approved

(6)查看node状态

稍等两分钟

[root@master ~]# kubectl get nodes
NAME    STATUS   ROLES    AGE   VERSION
node0   Ready       28m   v1.18.4
node1   Ready       11m   v1.18.4

8.2、部署第三个node节点

按照上面的前五步继续执行即可。做完之后如下所示:

[root@master ~]# kubectl get nodes
NAME    STATUS   ROLES    AGE   VERSION
node0   Ready       28m   v1.18.4
node1   Ready       11m   v1.18.4
node2   Ready       3m   v1.18.4

至此,二进制单节点集群部署已经完成,接下来我们可以测试一下集群是否可用。

9、测试kubernetes集群

(1)、创建一个nginx的pod

现在我们在kubernetes集群中创建一个nginx的pod,验证是否能正常运行。

在master节点执行一下步骤:

[root@master1 ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
[root@master1 ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

现在我们查看pod和service

[root@master1 ~]# kubectl get pod,svc -o wide

kubernetes二进制部署单master节点插图
打印的结果中,前半部分是pod相关信息,后半部分是service相关信息。我们看service/nginx这一行可以看出service暴漏给集群的端口是30249。记住这个端口。

然后从pod的详细信息可以看出此时pod在node2节点之上。node2节点的IP地址是192.168.50.132

(2)、访问nginx验证集群

那现在我们访问一下。打开浏览器(建议火狐浏览器),访问地址就是:http://192.168.50.132:30249
kubernetes二进制部署单master节点插图1

10、安装dashboard

10.1、创建dashboard

(1)创建并运行

先把dashboard的配置文件下载下来。由于我们之前已经添加了hosts解析,因此可以下载。

[root@master1 ~]# curl -o recommended.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

大概在此文件的32-44行之间,修改为如下:

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort                        #加上此行
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001                   #加上此行,端口30001可以自行定义
  selector:
    k8s-app: kubernetes-dashboard
  • 运行此yaml文件
[root@master1 ~]# kubectl apply -f recommended.yaml 
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
...
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

(2)测试是否正常

[root@master1 ~]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-694557449d-mlnl4   1/1     Running   0          2m31s
kubernetes-dashboard-9774cc786-ccvcf         1/1     Running   0          2m31s

主要是看status这一列的值,如果是Running,并且RESTARTS字段的值为0(只要这个值不是一直在渐渐变大),就是正常的,目前来看是没有问题的。我们可以继续下一步。

查看此dashboard的pod运行所在的节点
kubernetes二进制部署单master节点插图2

从上面可以看出,kubernetes-dashboard-9774cc786-ccvcf运行所在的节点是node2上面,并且暴漏出来的端口是30001,所以访问地址是: https://192.168.50.132:30001

(3)浏览器访问URL

用火狐浏览器访问,访问的时候会让输入token,从此处可以查看到token的值。

[root@master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

kubernetes二进制部署单master节点插图3

把上面的token值输入进去即可进去dashboard界面。
kubernetes二进制部署单master节点插图4

不过现在我们虽然可以登陆上去,但是我们权限不够还查看不了集群信息,因为我们还没有绑定集群角色,同学们可以先按照上面的尝试一下,再来做下面的步骤

10.2、cluster-admin管理员角色绑定

[root@master1 ~]# kubectl create serviceaccount dashboard-admin -n kube-system
[root@master1 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
[root@master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

再次使用输出的token登陆dashboard即可。

kubernetes二进制部署单master节点插图5kubernetes二进制部署单master节点插图6

本文链接:https://www.yunweipai.com/38941.html

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部