环境准备
主机名 | ip | 角色 |
---|---|---|
master | 192.168.3.149 | master,node |
node1 | 192.168.3.150 | node1 |
node2 | 192.168.3.151 | node2 |
配置过程
在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重新起来后即可解决问题。