快捷搜索:  汽车  科技

安装完k8s集群后怎么配置(本机搭建k8s集群图文详细介绍)

安装完k8s集群后怎么配置(本机搭建k8s集群图文详细介绍)# apt search docker.io apt-get update apt-get install -y docker.io systemctl enable docker systemctl start docker docker 配置代理。镜像源在墙外,docker pull image 需要代理mkdir -p /etc/systemd/system/docker.service.d cat <<EOF >/etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=https://192.168.99.1:8118/" Environment="HTTPS_PROXY=https://192.168.99.1:8118/" Environme

环境依赖

k8s 的镜像源在墙外,所以需要读者掌握科学上网的技能。这个部分不属于本文的描述范围,我使用的方案是 Shadowsocks Privoxy

安装完k8s集群后怎么配置(本机搭建k8s集群图文详细介绍)(1)

virtualBox 的版本不太重要,Docker 和 kube* 的版本最好使用 k8s 推荐的版本,否则可能会有问题。

搭建目标

安装完k8s集群后怎么配置(本机搭建k8s集群图文详细介绍)(2)

flannel.1 是 每台机器上的一个 VNI,通过 ifconfig 命令可以查看该接口的信息。

从任意一台机器 ping 另外两台机器 flanel.1 的 IP 能通就算集群搭建成功。

安装完k8s集群后怎么配置(本机搭建k8s集群图文详细介绍)(3)

k8s 个组件之间的关系

安装完k8s集群后怎么配置(本机搭建k8s集群图文详细介绍)(4)

k8s Pod 网络模型简介

安装完k8s集群后怎么配置(本机搭建k8s集群图文详细介绍)(5)

为了省事,我直接引用了别人画的模型图。对于本次搭建的集群模型简单描述如下:

安装完k8s集群后怎么配置(本机搭建k8s集群图文详细介绍)(6)

  1. cni0 和 flannel.1 都是 VNI,由 flannel 组件创建,集群搭建完成后可以通过 ifconfig 进行查看。
  2. flannel 组件 在每台机器上运行了一个 flanneld,它是用来转发流量,解决主机间通信的问题。
  3. enp0s8 是 virtualBox 的 Host-Only 适配器。
配置流程

使用 virtualBox 创建三台虚拟机

virtualBox 安装比较简单,不再介绍,GUI 工具用起来也很方便,这部分只介绍我认为需要提示的部分。

  1. 内存推荐 2048M CPU 推荐 2个
  2. 默认只有一个 NAT 适配器,添加一个 Host-Only Adapter。NAT 适配器是虚拟机用来访问互联网的,Host-Only 适配器是用来虚拟机之间通信的。
  3. 以 Normal Start 方式启动虚拟机安装完系统以后,因为是 server 版镜像,所以没有图形界面,直接使用用户名密码登录即可。
  4. 修改配置,enp0s8 使用静态 IP。注意配置时将其中的网络接口名改成你自己的 Host-Only Adapter 对应的接口。
  5. 一台虚拟机创建完成以后可以使用 clone 方法复制出两台节点出来,注意 clone 时为新机器的网卡重新初始化 MAC 地址。
  6. 三台虚拟机的静态 IP 都配置好以后就可以使用 ssh 在本地主机的终端上操作三台虚机了。虚机使用 Headless Start 模式启动
安装 Docker
  • 三台都装

当前 Ubuntu 的 docker 版本刚好合适,所以可以直接安装,但是有必要提前查看一下 docker 版本,以免装错。

# apt search docker.io apt-get update apt-get install -y docker.io systemctl enable docker systemctl start docker

  • docker 配置代理。镜像源在墙外,docker pull image 需要代理

mkdir -p /etc/systemd/system/docker.service.d cat <<EOF >/etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=https://192.168.99.1:8118/" Environment="HTTPS_PROXY=https://192.168.99.1:8118/" Environment="NO_PROXY=localhost 127.0.0.1 localaddress .localdomain.com" EOF systemctl daemon-reload systemctl restart docker

  • 测试配置

docker info | grep Proxy # 有输出说明配置成功 docker pull gcr.io/google-containers/busybox:1.27 # pull 成功代表工作正常。 安装 kube* 组件

  • 三台都装

apt-get update && apt-get install -y apt-transport-https curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl systemctl enable kubelet systemctl start kubelet

  • Master 节点配置 cgroup driver

docker info | grep -i cgroup # 一般是 cgroupfs cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # --cgroup-driver 对应值默认是 systemd #两个值不一致的话使用以下命令修改 sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf #重启 kubelet systemctl daemon-reload systemctl restart kubelet

  • curl 访问的是墙外的网站,无法访问的话可以配置系统代理。

http://192.168.99.1:8118/ 是我本地使用的 HTTP 代理,Privoxy 监听 8118 端口,按照实际情况修改该地址。

# 全局代理,不推荐

cat <<EOF >>/etc/environment http_proxy="http://192.168.99.1:8118/" https_proxy="http://192.168.99.1:8118/" no_proxy="master node1 node2 192.168.99.1" EOF source /etc/environment #当前 shell 推荐 export http_proxy="http://192.168.99.1:8118/" export https_proxy="http://192.168.99.1:8118/" export no_proxy="master node1 node2 192.168.99.1"

  • apt 使用代理

cat <<EOF >>/etc/apt/apt.conf Acquire::http::Proxy "http://192.168.99.1:8118/"; Acquire::https::Proxy "https://192.168.99.1:8118/"; EOF 搭建集群

禁用交换区

k8s 文档明确要求的。

  • 三台都禁用

swapoff -a

初始化 master 节点

  • 初始化过程会访问墙外网站,如果 init 不能顺利执行,请配置全局代理

kubeadm init --apiserver-advertise-address=192.168.99.200 --pod-network-cidr=10.244.0.0/16

  1. --apiserver-advertise-address=192.168.99.200 绑定 apiserver 到 master 节点的 Host-Only 适配器的地址,默认是绑到 NAT 的地址上,这样其他机器是永远也访问不到的。
  2. --pod-network-cidr=10.244.0.0/16 指定 pod 网络地址空间,我们使用 flannel 组件必须使用这个空间。
  3. kubeadm 的完整参考手册(https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/)
  4. 推荐保存最后输出的 join 命令到文件(以免忘记或找不到了),方便添加节点到集群。如果忘了也找不到输出了,网上有方法生成哈希值,请自行查找。
  • 配置 kubectl 访问集群

# root user export KUBECONFIG=/etc/kubernetes/admin.conf # non-root user mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 从本地主机操作,需要在本地安装 kubectl 客户端 mkdir -p ~/.kube scp <username>@192.168.99.200:/home/<username>/.kube/config ~/.kube/config # 从 master 复制配置文件到本地

  • 测试配置

kubectl cluster-info #有正常输出即可

安装 flannel 网络

  • flannel 默认的监听接口是 NAT 适配器的接口,我们需要的是 Host-Only 适配器的接口,所以需要修改 kube-flannel.yml 文件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 给 /opt/bin/flanneld 命令添加 --iface="enp0s8" 参数 # enp0s8 是 Host-Only 适配器对应的接口 kubectl apply -f kube-flannel.yml

  • 测试配置

kubectl get pods --all-namespaces -o wide # 稍等一会,下载镜像需要一定时间,最后应该显示 flannel pods 是 Running 状态, kube-dns 也是 Running 状态

  • 消除 master 隔离。默认 master 上不调度 pods,要允许另外的 pods 在 master 上运行请执行该命令

kubectl taint nodes --all node-role.kubernetes.io/master-

添加节点到集群

  • 在节点上执行 kubeadm init 最后输出的 join 命令

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

喜欢的小伙伴,点个关注吧!

猜您喜欢: