环境准备

主机名ip角色
master192.168.3.149master,node
node1192.168.3.150node1
node2192.168.3.151node2

配置过程

在master和node上执行:
1、关闭swap:

swapoff -a

2、在安全的内部网络环境中关闭防火墙(或者在防火墙上配置各组件需要相互通信的端口号)

systemctl disable firewalld
systemctl stop firewalld

3、在主机上禁用SELinux,让容器可以读取主机的文件系统

setenforce 0

4、安装kubeadm和相关工具
首先配置yum源:

/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

安装kubeadm和相关工具:

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
yum install docker

打开服务并设为开机自启:

systemctl enable docker && systemclt start docker
systemctl enable kubelet && systemctl start kubelet

5、执行kubeadm config init-defaults可以获得默认的初始化参数文件:
-> init.default.yaml
对生成的文件进行编辑,可以按需生成合适的配置,并保存为init-config.yaml备用

init-config.yaml:
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.3.149 #这里改为master的ip
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #修改镜像源
kind: ClusterConfiguration
kubernetesVersion: v1.19.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12  #service地址范围
  podSubnet: 10.244.0.0/16  #pod地址范围
scheduler: {}

6、下载Kubernetes相关镜像

kubeadm config image pull --config=init.yaml

7.运行kubeadm init安装master
在master节点执行:
(若失败可执行kubeadm reset将主机恢复原状再执行kubeadm init安装)

kubeadm init --config=init-config.yaml

8.复制配置文件到用户的$home目录下

rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

为了避免后续踩坑(node节点使用kubectl报错),最好将master节点中的【/etc/kubernetes/】目录下的admin.conf文件拷贝到所有node节点的相同目录下,然后配置环境变量:export KUBECONFIG=/etc/kubernetes/kubelet.conf
9、安装calico网络插件

# 安装 calico 网络插件
echo "安装calico-3.13.1"
rm -f calico-3.13.1.yaml
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml

10、安装node并加入集群
在master节点上执行:

kubeadm token create --print-join-command

得到以下输出:

kubeadm join 192.168.3.149:6443 --token ybecst.7e2omn4gyizfwju3     --discovery-token-ca-cert-hash sha256:4109b4a6c4d7f18856b8a83f24c63d603a678f9f80966600c936add910e5a1e4

在node节点上执行:
创建node节点的配置文件:join-config.yaml

apiVersion: kubeadm.k8s.io/v1beta1
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.3.149:6443  #master节点的ip地址和端口
    token: ybecst.7e2omn4gyizfwju3   #刚刚在master上获取的token
    unsafeSkipCAVerification: true
  tlsBootstrapToken: ybecst.7e2omn4gyizfwju3  #刚刚在master上获取的token

执行kubeadm join命令,将Node加入集群:

kubeadm join --config=join-config.yaml

11、查看node节点安装情况:

kubectl get nodes

在这里插入图片描述

12、(可选)让Master成为一个node

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

13、(可选)安装kuboard

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml

获取token:

echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

访问kuboard:

http://任意一个Worker节点的IP地址:32567/

在这里插入图片描述

配置过程中出现的问题及解决方法

1、在node1和node2节点上使用kubectl出现报错:
“The connection to the server localhost:8080 was refused - did you specify the right host or port?”

解决方法:
将master节点中的【/etc/kubernetes/】这个目录下的admin.conf文件拷贝到所有node节点的相同目录下,然后配置环境变量:export KUBECONFIG=/etc/kubernetes/kubelet.conf即可。

2、配置完k8s集群后无法使用内部ip访问容器或服务:
查看一下calico的日志
kubectl log 【任意一个calico-node的pod名】 -c calico-node -n kube-system

主要看这一项:
在这里插入图片描述

(kubectl logs calico-node-7zj85 -c calico-node -n kube-system |grep ‘Using autodetected IPv4’)
可以看到它用了一个莫名其妙的地址。
查阅资料(https://docs.projectcalico.org/reference/node/configuration#ip-autodetection-methods)可得:
当使用Calico进行路由时,每个节点必须配置一个IPv4地址和/或一个IPv6地址,用于在节点之间进行路由。
calico 默认以 first-found 方法来检ip地址,也就是把找到的一个IP地址作为calico的工作网卡,这就导致上面的问题。而can-reach方法使用本地路由来确定将使用哪个IP地址来到达提供的目的地。
因此可以将该can-reach检测地址设为网关的IP。
修改calico.yaml中的calico-node env,添加

IP_AUTODETECTION_METHOD:
spec:
  hostNetwork: true
  serviceAccountName: calico-node
  terminationGracePeriodSeconds: 0
  containers:
    - name: calico-node
      image: calico/node:v3.1.3
      env:
        - name: IP_AUTODETECTION_METHOD
          value: can-reach=192.168.3.0  #这里设为网关地址

然后重新apply calico.yaml
等服务和pod重新起来后即可解决问题。

Logo

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

更多推荐