环境说明

操作系统内核
centos 7.23.10.0.327

当做主节点的服务器要能免密访问从节点的服务器

遇到的坑

  1. 内核需要升级到3.10.0.1160这样的版本,不然会执行k8s集群初始化时报cgroup pid not found错误

升级内核
yum update kernel 并重启

  1. docker版本不能太高,不然就会启动崩溃
  2. kubeadm初始化集群时,需要加上一些内部网络配置podsubnet,具体参考对应步骤的配置文件
  3. cni里没有flannel插件,需要单独下载部署

搭建上网代理

部署的服务器不能联网,搭建一个代理服务器来上网(挑了个麻烦的编译安装,yum也可以直接安装,好处是自己随意删除)

安装nginx

安装编译前的依赖

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

下载nginx源码

http://nginx.org/en/download.html

因为会用到https协议,nginx编译时需要打下补丁,参考:

https://blog.csdn.net/qq_42890862/article/details/129617736

./configure --prefix=install_dir  --with-http_ssl_module 
make -j9
make install

安装路径install_dir就填自己的账户下的自定义的路径即可,不用安装到系统路径下

反向代理

有正向代理后,这步其实不用就行。
就记录下当时的一些配置。
下面是ngingx里添加的一些反向代理的配置项,主要是让部署服务器能通过该服务器去访问阿里云的yum源,从而能安装k8s和docker

location /centos/ {
           proxy_pass http://mirrors.aliyun.com/centos/ ;
        }


       location /epel/ {
           proxy_pass http://mirrors.aliyun.com/epel/ ;
       }

        location /docker-ce/ {
           proxy_pass http://mirrors.aliyun.com/docker-ce/ ;
        }
        location /kubernetes/ {
           proxy_pass http://mirrors.aliyun.com/kubernetes/ ;
        }

正向代理

配置正向代理其实就够了。
下面是正向代理的配置,其中第一个43876端口是代理http请求,43879是代理的https请求。

server {
    resolver 8.8.8.8;
    listen 43876;
    location / {
        proxy_pass http://$http_host$request_uri;
        proxy_set_header HOST $http_host;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0k;
        proxy_connect_timeout 30;
        proxy_send_timeout 60;
        proxy_read_timeout 60;
        proxy_next_upstream error timeout invalid_header http_502;
    }
}


server {
     listen                         43879;

     resolver                       223.5.5.5;
     proxy_connect;
     proxy_connect_allow            443 563;
     proxy_connect_connect_timeout  10s;
     proxy_connect_read_timeout     10s;
     proxy_connect_send_timeout     10s;

     location / {
         proxy_pass http://$host;
         proxy_set_header Host $host;
     }
 }

安装k8s

配置阿里云的yum源,参考https://developer.aliyun.com/article/653767

并且把mirrors.aliyun.com替换成刚才的代理服务器的ip加端口43876。

安装docker

更详细的可以参考:https://www.runoob.com/docker/centos-docker-install.html

添加docker源镜像

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

查看docker版本

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

开始安装

yum install docker-ce-18.06.1.ce-3.el7

有个坑
linux内核比较旧,安装版本不能太高,不然docker不能正常启动,经过测试下面版本是可以运行的18.06.1.ce-3.el7,也可以在查看docker版本时看到有多种版本

启动

systemctl start docker
docker info

docker info显示正常,表示docker安装完成

配置一下docker的代理

 /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://ip:43876/"
Environment="HTTPS_PROXY=http://ip:43879/"
Environment="NO_PROXY=localhost,127.0.0.1,.daocloud.io"

再重启下docker

systemctl daemon-reload
systemctl restart docker

测试下docker的速度

docker run hello-world

安装k8s

主要参考两篇博客:

  1. https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY#nav_3
  2. https://segmentfault.com/a/1190000038360804

下面是步骤:

准备环境

关闭selinux

# 所有节点关闭 SELinux
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

关闭交换区

swapoff -a
所有节点确保防火墙关闭
systemctl stop firewalld
systemctl disable firewalld

还需要设置docker的cgroupdriver使用systemd管理,跟k8s保持一致。

打包成一个shell脚本prepare.sh,各个节点运行

swapoff -a
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
systemctl stop firewalld
systemctl disable firewalld
cat <<EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

执行安装

# 添加 k8s 安装源
cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://代理ip/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://代理ip/kubernetes/yum/doc/yum-key.gpg https://代理ip/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/

执行安装

yum install -y --nogpgcheck kubelet-1.23.12 kubeadm-1.23.12 kubectl-1.23.12

启动,并且配置开机启动

systemctl enable kubelet
systemctl start kubelet

配置集群

开始搭建k8s集群

主节点操作
# 只在 master 节点执行
export MASTER_IP=部署主ip
# 替换 k8s.master 为 您想要的 dnsName
export APISERVER_NAME=k8s.master
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=172.18.0.1/16
# 下面这步要在所有的节点执行
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts 

创建一个配置文件kubeadm-config.yaml为:

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.23.12
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "k8s.master:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "172.18.0.1/16"
  dnsDomain: "cluster.local"

开始初始化集群

kubeadm init --config=kubeadm-config.yaml --upload-certs

成功后,会输出join类似的命令行,这个从节点用来加入集群的,可以复制到一个地方保留下。

kubeadm join k8s.master:6443 --token xxxxx         --discovery-token-ca-cert-hash sha256:xxxx                                                           

如果忘记了,可以通过下面命令重新获取

kubeadm token create --print-join-command

接着在主节点执行下面的操作

# 复制授权文件,以便 kubectl 可以有权限访问集群
# 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群

如果操作有问题,可以重新来,命令是

kubeadm reset
从节点操作

从节点可以开始加入集群,运行命令如下,其实是从kube ad:

kubeadm join k8s.master:6443 --token xxxxx         --discovery-token-ca-cert-hash sha256:xxxx  

如果有问题可以执行kubeadm reset 重新来

安装网络插件flannel

主节点操作

通过kubectl get node可以看到当前集群的节点情况,此时应该都是NotReady状态,原因是网络没打通成功,需要安装网络插件才行。用的比较多的是flannel

先去下载flannel的yaml文件
路径是:
https://github.com/flannel-io/flannel/blob/v0.13.1-rc2/Documentation/kube-flannel.yml

因为阿里云的镜像库里只有0.13.1-rc2版本,所以就下这个版本,不然拉不下来镜像也没法运行

需要修改下配置,将下面这段的网络,改成跟上面的kubeadm-config.yaml里的podsubnet里一样

net-conf.json: |
    {
      "Network": "10.18.0.1/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

执行插件安装

kubectl apply -f kube-flannel.yaml

到这里,其实还会出错。(原因是CNI Plugins中没有flannel)

可以看到所有的节点都不是ready状态

kubectl get node

可以通过下面的命令来看报错信息

journalctl -u kubelet -f

617 21:53:24 hadoop002 kubelet[12440]: E0617 21:53:24.875491   12440 kubelet.go:2391] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized"
617 21:53:29 hadoop002 kubelet[12440]: I0617 21:53:29.012785   12440 cni.go:205] "Error validating CNI config list" configList="{\n  \"name\": \"cbr0\",\n  \"cniVersion\": \"0.3.1\",\n  \"plugins\": [\n    {\n      \"type\": \"flannel\",\n      \"delegate\": {\n        \"hairpinMode\": true,\n        \"isDefaultGateway\": true\n      }\n    },\n    {\n      \"type\": \"portmap\",\n      \"capabilities\": {\n        \"portMappings\": true\n      }\n    }\n  ]\n}\n" err="[failed to find plugin \"flannel\" in path [/opt/cni/bin]]"
解决办法

去下载下flannel插件,下载路径如下

https://github.com/containernetworking/plugins/releases/tag/v0.8.6

解压

tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz

将解压后的flannel插件上传到各个节点/opt/cni/bin/

执行kubectl get node就可以看到都正常了

[root@hadoop002 ~]# kubectl get node
NAME        STATUS   ROLES                  AGE   VERSION
hadoop002   Ready    control-plane,master   16h   v1.23.12
hadoop003   Ready    <none>                 16h   v1.23.12
hadoop004   Ready    <none>                 16h   v1.23.12
hadoop005   Ready    <none>                 16h   v1.23.12

安装calico网络插件

flannel有点麻烦,可以直接安装下面这个网络
https://www.jianshu.com/p/2c436a0ffe7f

Logo

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

更多推荐