K8s笔记--集群部署
前言
在了解了K8s的基础架构之后我们就可以尝试去部署K8s集群,目前K8s集群部署的方式有3种:
方式名称 | 区别 |
---|---|
MiniKube | 仅支持单节点部署集群,相当于是初学者学习K8s集群的工具 |
Kubeadm | 通过Kubeadm init初始化集群以及通过kubeadm join 加入Node节点,以此来实现集群部署。部署比较方便,执行init会自动初始化Master节点需要的服务 |
二进制包 | 从官网下载各个服务的二进制包单独部署 |
该篇文章将展示如何通过Kubeadm部署集群并且实现公网部署。(由于仅俩台服务器且处在不同的内网下导致只能通过公网部署,正常企业阿里云同一账户下的俩台ECS处在同一内网)
Kubeadm 集群部署
- 安装Docker(Master、Node)
安装Docker可参考官方文档,注意这里Docker有个配置需要调整,我们需要调整Docker的Cgroup为systemd(目的是跟K8s保持一致),Docker默认的是groupfs。不确定的同学可以执行docker info | grep cgroup
看一下。更改方式如下:
执行vim /etc/docker/daemon.json
1
2
3
4
5
6{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
],
"exec-opts": ["native.cgroupdriver=systemd"] // 新增该行
}
安装Kubeadm、kubeadm、kubectl(Master、Node)
1
2
3
4
5
6
7
8
9// 添加k8s的源
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
// 执行命令
apt-get update
apt-get install -y kubelet kubeadm kubectl更新containerd种sandbox的源为国内镜像(Master、Node)
执行containerd config default > /etc/containerd/config.toml
,执行/etc/containerd/config.toml
编辑配置文件中的sandbox_image配置改为registry.aliyuncs.com/google_containers/pause:3.6
。之后执行service containerd restart
重启服务。1
2
3...
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6" // 替换成国内阿里云的源
...初始化Master节点(Master)
1
2
3
4
5
6
7
8
9
10kubeadm init --apiserver-advertise-address=<IP> --image-repository registry.aliyuncs.com/google_containers --kubernetes-version latest --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
# 执行成功后根据提示执行
# 根据提示后续执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf安装网络插件Flannel
为了保证集群拥有一个正常工作的POD网络,我们需要为集群安装网络插件。网络插件有很多,这里采用的是Flannel。1
2
3wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
// 执行清单
kubectl -f kube-flannel.ymlNode加入集群
1
kubeadm join <IP>:6443 --token <token> --discovery-token-ca-cert-hash <hash>
注意这里的token是有有效期的,若token过期执行以下命令行:
1
kubeadm token create --print-join-command
公网部署配置调整
以上操作作用于内网集群部署,由于目前俩台服务器一台为本人自己的腾讯云服务器、一台为朋友的腾讯云服务器因此是不能搭建常用的内网集群(常规企业内部基本上都是内网搭建集群,原因也很简单不需要考虑带宽、流量)。为了实现K8s的集群搭建学习还是需要调整一下配置让K8s支持公网部署。因此以下操作仅用作记录。
创建虚拟网卡(Master、Node)
1
2// 创建虚拟网卡绑定公网ip
sudo ifconfig eth0:1 <公网IP>调整kubelet的启动参数(Master、Node)
执行vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
新增–node-ip参数1
2
3...
// 新增--node-ip参数
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=<公网IP>修改api-server参数(Master)
执行vi /etc/kubernetes/manifests/kube-apiserver.yaml
编辑指定参数1
2
3...
- --advertise-address: <公网IP>
- --bind-address: 0.0.0.0调整网络插件Flannel配置参数(Master)
执行vim kube-flannel.yml
编辑指定参数1
2
3
4
5
6
7
8
9
10
11
12...
args:
- --ip-masq
- --public-ip=$(PUBLIC_IP)
- --iface=eth0
- --kube-sub-net-mgr
...
env:
- name: PUBLIC_IP
valueFrom:
fieldRef:
fieldPath: status.podIP确保iptables能够监控容器的网络通信(Master、Node)
1
2
3
4
5
6
7
8
9cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system调整kubeadm初始化参数(Master)
执行kubeadm init --apiserver-advertise-address=<公网IP> --control-plane-endpoint=<公网IP> --image-repository registry.aliyuncs.com/google_containers --kubernetes-version latest --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
排查问题命令
journalctl -f -u kubelet
kubectl logs <pod> -n <namespace>
常见问题以及解决办法
初始化Err:crictl not found in system path
1
2wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.29.0/crictl-v1.29.0-darwin-amd64.tar.gz
tar zxvf crictl-v1.29.0-linux-amd64.tar.gz -C /usr/local/bin初始化Err: conntrack not found in system path
1
apt-get install -y conntrack
镜像源问题导致镜像拉不下来
修改配置文件,将镜像源改为国内镜像地址- “cni0” already has an IP address different from 10.244.2.1/24”
1
2
3
4
5
6
7
8
9
10
11
12
13# 执行ifconfig发现cni0的网卡绑定的ip为如下所示:
cni0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.244.1.1 netmask 255.255.255.0 broadcast 10.244.1.255
inet6 fe80::4820:22ff:fedb:f685 prefixlen 64 scopeid 0x20<link>
ether 4a:20:22:db:f6:85 txqueuelen 1000 (Ethernet)
RX packets 80 bytes 5520 (5.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5 bytes 446 (446.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 发现网卡绑定的ip是10.244.1.1,同10.244.2.1/24并不在同一个网段,解决的办法执行如下命令即可:
ifconfig cni0 down
ip link delete cni0
K8s有着非常不错的社区,因此基本问题都能通过google找到答案,只要我们了解排查问题的命令即可。
集群部署后验证
这里是准备了一个简单的资源清单分别是:
my-nginx-deploy.yml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-test
namespace:
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
my-nginx-service.yml1
2
3
4
5
6
7
8
9
10
11apiVersion: v1
kind: Service
metadata:
name: my-nginx-test-service
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
分别执行后若能通过Service对外暴露的端口<Node IP>:<Service Port>
正常展示nginx页面说明集群部署成功。