一、环境准备:

给机器配置hosts:vi /etc/hosts

166.108.30.230 k8s-master
166.108.31.6 k8s-worker1
166.108.31.12 k8s-worker2
166.108.30.108 harbor01.io

hosts其中有一个harbor的主机地址是通过nginx转发的。harbor默认是80端口,但是与k8s worker在一台机器上会端口冲突,所以把harbor端口改为18800,并且nginx代理,nginx配置如下:

vi /etc/nginx/nginx.conf

upstream bdp-harbor-web{
server 166.108.31.12:18880;
}

server {
listen 80;
server_name harbor01.io;

  location / {
             proxy_pass http://bdp-harbor-web;
             proxy_set_header        Host $host:$server_port;
             proxy_set_header        X-Real_IP $remote_addr;
             client_max_body_size       10000m; #允许客户端请求的最大单文件字节数
 }

}

二、先在harbor页面建一个项目叫rancher

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OUL05NsM-1634019599158)(user-images/image-20210831150048757.png)]
把所有的rancher-images.tar.gz这个包上传到harbor中,这个gz包的生成见另一篇文章:rancher镜像上传到harbor私库


三、rancher离线安装k8s

以下所有操作在rancher页面中进行:

  1. 新建集群的配置

  2. 系统设置
    修改docker为自己的版本
    在这里插入图片描述
    修改rancher server访问地址,必须是https,集群中所有主机都能访问此地址
    在这里插入图片描述
    修改镜像摘取地址为私库地址
    在这里插入图片描述

  3. 安装

    1)master :192.168.0.15
    在这里插入图片描述
    2)worker:192.168.0.14
    在这里插入图片描述
    3)worker:192.168.0.9
    安装同上

安装后,等一会儿,待所有节点状态变为active即为成功。

四、安装使用k8s遇到的问题
1. worker节点一直waiting

分析:docker ps,再docker logs查看容器镜像名称为:nginx-proxy的日志,发现报以下错误:/usr/bin/nginx-proxy: line 4: /usr/bin/confd: cannot execute binary file: Exec format error。说明confd没有渲染。在去找master:6443时由于没有渲染会导致去找127.0.0.1:6443端口找不到而报的错。
解决:需要改下nginx-proxy容器的配置,步骤如下:
​ 1)进入nginx-proxy容器内,

docker exec -it nginx-proxy bash
bash-5.1# cd /etc/nginx/
bash-5.1# vi /etc/nginx/nginx.conf
bash-5.1# exit

2)其中/etc/nginx/nginx.conf文件模板改为以下内容:

error_log stderr notice;

worker_processes auto;
events {
  multi_accept on;
  use epoll;
  worker_connections 1024;
}

stream {
        upstream kube_apiserver {
            server 10.4.3.38:6443;//把这个地址改成真正master的主机ip和端口号
        }

        server {
            listen 6443;
            proxy_pass kube_apiserver;
            proxy_timeout 30;
            proxy_connect_timeout 2s;

        }
}

3)最后退出容器,再重启docker:systemctl restart docker

2. failed to set bridge addr: “cni0” already has an IP address different from 10.42.0.1/24

解决:1)首先我们重新配置k8s的flannel文件,可以参考其他环境的文件配置,也可以重新安装插件生成,会在/run下面生成flannel文件夹,下面包含网络配置环境变量(注明:三个节点的subnet网段不能相同)

[root@cn01 flannel]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.42.0.0/16
FLANNEL_SUBNET=10.42.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

2)ifconfig命令查看出错节点cni0的网卡配置,发现cni0的这个网卡地址是.,明显与报错中的10.42.0.1不一致

[root@cn01 flannel]# ifconfig cni0
cni0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.100.1.1 netmask 255.255.255.0 broadcast 172.100.1.255
inet6 fe80::60bc:ecff:febc:5d32 prefixlen 64 scopeid 0x20

3)我们可以将其改为10.42.0.1,也可将这个错误的网卡删掉,它会自己重建,这里采用删除重生的方法,首先停用网络,然后删除配置

[root@cn01 flannel]# ifconfig cni0 down
[root@cn01 flannel]# ip link delete cni0

4)然后查看节点重建的cni0网卡,会依据flannel的网络环境配置生成

[root@cn01 flannel]# ifconfig cni0
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.42.0.1 netmask 255.255.255.0 broadcast 10.42.0.255

3. rancher安装k8s后,在主机没有kubectl命令

下载kubectl命令:curl -LO “https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/arm64/kubectl”

chmod 777 kubectl

把rancher上的kubconfig文件拷贝到/etc/kubernetes/下改为admin.conf;

把rancher上的kubconfig文件将配置保存到~/.kube/config

把kubectl放入/usr/sbin下供全局访问

4.rancher页面删除不了命名空间

问题:刚新建的命名空间ide想删除,页面删除后一直是removing状态,用命令查看kubectl get ns为Terminating状态

分析:1)查看命名空间详情kubectl get ns ide -o yaml

2)查看该命名空间下的资源:kubectl api-resources -o name --verbs=list --namespaced | xargs -n 1 kubectl get --show-kind --ignore-not-found -n ide报错:error: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request。

随后查kubectl get apiservice,发现下面服务状态为false,但是查看docker ps或kubectl get pods -n kube-system,该服务已经启动,暂时不管

v1beta1.metrics.k8s.io kube-system/metrics-server False (FailedDiscoveryCheck

或用此命令查看kubectl get all -n ide,输出No resources found in ide namespace,说明没有资源占用空间

3)尝试对命名空间进行删除:kubectl delete ns ide

4) 尝试强制删除[root@cn01 kubernetes]# kubectl delete ns ide --force --grace-period=0

warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
namespace “ide” force deleted

仍然删除不了

5)使用curl删除:

kubectl get namespace ide -o json > ide.json

执行完这条命令后,当前文件夹会出现ide.json这个文件,打开这个文件,删除字段specfinalizers这两个字段包含的内容,,再执行以下:

curl -k -H "Content-Type:application/json" -X PUT --data-binary @ide.json https://192.168.0.15:6443/api/v1/namespaces/ide/finalize还是没有删除:原因是Unauthorized

5. docker push harbor01.io/ide/*时报错:413 Request Entity Too Large

解决:配置的私库harbor01.io用了nginx,限制了文件大小,nginx.conf文件改为如下配置:

server {
listen 80;
server_name harbor01.io;

​ location / {
​ proxy_pass http://bdp-harbor-web;
​ proxy_set_header Host h o s t : host: host:server_port;
​ proxy_set_header X-Real_IP $remote_addr;
client_max_body_size 10000m; #允许客户端请求的最大单文件字节数
​ }

}

Logo

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

更多推荐