基础环境配置

注意!!!先对系统进行对时,否则出现证书错误。

转发 IPv4 并让 iptables 看到桥接流量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

通过运行以下指令确认 br_netfilteroverlay 模块被加载:

1
2
lsmod | grep br_netfilter
lsmod | grep overlay

通过运行以下指令确认 net.bridge.bridge-nf-call-iptablesnet.bridge.bridge-nf-call-ip6tablesnet.ipv4.ip_forward
系统变量在你的 sysctl 配置中被设置为 1。

1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

关闭 Swap 分区,编辑 /etc/fstab 删除 /swap.img 条目,然后重启。

安装运行时 containerd

https://github.com/containerd/containerd/releases 下载最新稳定版二进制包。

1
2
wget https://github.com/containerd/containerd/releases/download/v1.6.24/containerd-1.6.24-linux-amd64.tar.gz
tar Cxzvf /usr/local/ containerd-1.6.24-linux-amd64.tar.gz

添加系统 service 文件 https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
/usr/lib/systemd/system/ 目录。

1
wget -O /usr/lib/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service

启用 service。

1
2
systemctl daemon-reload
systemctl enable --now containerd

安装 runc,从 https://github.com/opencontainers/runc/releases 下载最新稳定二进制放入 /usr/local/bin/runc 即可。

1
2
wget -O /usr/local/bin/runc https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
chmod +x /usr/local/bin/runc

安装 CNI 插件,从 https://github.com/containernetworking/plugins/releases 下载最新稳定版,解压到 /opt/cni/bin

1
2
3
mkdir -p /opt/cni/bin
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.3.0.tgz

安装 crictl ,从 https://github.com/kubernetes-sigs/cri-tools/releases 下载二进制放入 /usr/local/bin/crictl 即可,配置
crictl。

1
2
3
4
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.28.0/crictl-v1.28.0-linux-amd64.tar.gz
tar Cxzvf /usr/local/bin crictl-v1.28.0-linux-amd64.tar.gz
chmod +x /usr/local/bin/crictl
crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock

生成 containerd 配置文件。

1
2
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

修改 /etc/containerd/config.toml 中的 SystemdCgroup 为 true,重启服务。

1
systemctl restart containerd

安装 kubeadm、kubelet 和 kubectl

1
2
3
4
5
6
7
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://dl.k8s.io/apt/doc/apt-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

以上三个步骤,无论是 master 还是 node 都需要执行。


配置 k8s master

1
kubeadm init --pod-network-cidr=10.0.0.0/16

创建配置文件

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

创建成功后会给出 node 的连接命令,类似

1
2
kubeadm join 192.168.1.60:6443 --token u4jjkw.vgozjpyog6mjqsbr \
--discovery-token-ca-cert-hash sha256:56fb7d7966421cac222eb5ecb299b65aaac62cdf10891030e292f298d54a31fb

如果 token 已经过了有效期可以通过 kubeadm token create --print-join-command 生成新 token

生成 token 命令 kubeadm token create

查看证书 hash

命令 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

加入命令是 kubeadm join <master ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<证书 hash>

查看已经生成的 token

kubeadm token list

添加快捷键

1
2
alias k=kubectl
alias kcd='kubectl config set-context $(kubectl config current-context) --namespace '

安装 CNI 组件 (安装一个即可)

安装 Calico

导入 CRD 文件

1
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml

下载配置文件

1
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml

修改配置文件中的 pod 网段和集群的 pod 网段相同 cidr,安装组件

1
k apply -f custom-resources.yaml

安装完成后,master 节点处于 ready 状态,集群创建成功

安装 Cilium

pass

安装 Flannel

下载配置文件

1
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

修改 pod 网段 net-conf.json 为初始化的网段

1
2
3
4
5
6
7
8
9
...
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
...

然后 kubectl apply -f kube-flannel.yml 即可。


添加 node 节点

节点也需要配置好初始化环境和 containerd 以及 cni 插件。

加入集群运行,需要用到 master 初始化时打印的加入命令。

1
2
kubeadm join 192.168.1.60:6443 --token u4jjkw.vgozjpyog6mjqsbr \
--discovery-token-ca-cert-hash sha256:56fb7d7966421cac222eb5ecb299b65aaac62cdf10891030e292f298d54a31fb

等待集群配置好既可以使用 node 节点。

1
kubectl get nodes # 用来查看当前节点信息

安装 Helm

进入 https://github.com/helm/helm/releases 下载最新稳定版放入 /usr/local/bin/ 即可。

1
2
3
wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz
tar xzvf helm-v3.12.3-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

安装负载均衡控制器 (安装一个即可)

安装 OpenELB

1
2
3
4
helm repo add kubesphere-stable https://charts.kubesphere.io/stable
helm repo update
kubectl create ns openelb-system
helm install openelb kubesphere-stable/openelb -n openelb-system

Layer2 模式

启用 kube-proxy strictARP

1
kubectl edit configmap kube-proxy -n kube-system

编辑 data.config.conf.ipvs.strictARP 为:

1
2
ipvs:
strictARP: true

重启 kube-proxy。

1
kubectl rollout restart daemonset kube-proxy -n kube-system

设置 NIC。

1
kubectl annotate nodes k8s-master layer2.porter.kubesphere.io/v1alpha1="192.168.1.60"

创建 EIP 地址池 porter-layer2-eip.yaml

1
2
3
4
5
6
7
8
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
name: porter-layer2-eip
spec:
address: 192.168.1.70-192.168.1.250
interface: ens33
protocol: layer2

使配置文件生效。

1
kubectl apply -f porter-layer2-eip.yaml

安装 MetalLB

1
2
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb --namespace metallb-system --create-namespace --wait

创建配置文件 ip-pool.yaml。

1
2
3
4
5
6
7
8
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.70-192.168.1.250

创建配置文件 layer2.yaml。

1
2
3
4
5
6
7
8
9
10
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: layer2
namespace: metallb-system
spec:
ipAddressPools:
- ip-pool
interfaces:
- ens33

测试 LB 是否正常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: apps/v1
kind: Deployment
metadata:
name: lb-layer2
spec:
replicas: 2
selector:
matchLabels:
app: lb-layer2
template:
metadata:
labels:
app: lb-layer2
spec:
containers:
- image: nginx
name: kubia
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: lb-layer2-svc
annotations:
lb.kubesphere.io/v1alpha1: porter
protocol.porter.kubesphere.io/v1alpha1: layer2
eip.porter.kubesphere.io/v1alpha2: porter-layer2-eip
spec:
selector:
app: lb-layer2
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
externalTrafficPolicy: Cluster

检查 svc 的 EXTERNAL-IP 是否正常。ip neigh 可以查看 ip 和 mac 地址绑定关系。

安装 metrics-server 支持 kubectl top

Value.yaml 文件内容。

1
2
3
4
5
6
7
args:
- --cert-dir=/tmp
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
- --logtostderr

使用 value.yaml 来安装。

1
2
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install metrics-server metrics-server/metrics-server -f value.yaml --namespace metrics-system --create-namespace --wait

查看 k8s 指标。

1
2
kubectl top node
kubectl top pod

安装 Ingress NGINX Controller 来支持 ingress

1
helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace

k8s 基本功能基本已经都安装好了。Enjoy it !