Kubernetes安装参考文档
安装 kubeadm, kubelet and kubectl
kubeadm
: 引导集群的命令。
kubelet
: 在集群中的所有机器上运行并执行诸如启动 pod 和容器之类的操作的组件。
kubectl
: 命令行实用程序与集群交互。
以下 Kubernetes 安装基于 centos7 操作系统。
1
2
3
|
# 关闭 swap 分区
sed -i '/ swap /s/^\(.*\)$/#\1/' /etc/fstab
swapoff -a
|
1
2
3
4
5
6
7
|
cat <<EOF | tee /etc/modules-load.d/optimize.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# package ipset,网络工具
yum install -y ipset ipvsadm
# 支持 IPVS needs module - package ipset
cat <<EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
|
1
2
3
4
5
6
7
8
9
|
cat <<EOF > /etc/sysctl.d/optimize.conf
vm.overcommit_memory = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p /etc/sysctl.d/optimize.conf
|
- 配置安装源(需要安装 Kubernetes 版本就修改下面的版本号 [v1.30 / v1.29])
1
2
3
4
5
6
7
8
|
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF
|
- kubeadm/kubelet/kubectl安装
1
2
3
4
5
6
7
8
|
# 移除已经安装
yum remove -y kubelet kubeadm kubectl
# 加载镜像源
yum clean all && yum makecache
# 安装 kubelet / kubeadm / kubectl
yum install -y kubelet-1.30.4 kubeadm-1.30.4 kubectl-1.30.4
# 开机自启
systemctl enable kubelet
|
由于国内无法直接拉取 registry.k8s.io 镜像,需要切换国内阿里 k8s 镜像源。
- 拉取镜像,注意:拉取镜像需和安装的 kubeadm 版本一致,不然可能导致拉取镜像版本不一致
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
|
# 采用阿里 k8s 镜像源拉取镜像
kubeadm config images pull \
--kubernetes-version=1.30.4 \
--image-repository=registry.aliyuncs.com/google_containers \
| tee kubeadm-images-1.30.4.txt
# 变更镜像 tag 为 k8s 原始 tag,注意 coredns 需特殊处理
# registry.aliyuncs.com/google_containers/coredns:v1.11.1
# registry.k8s.io/coredns/coredns:v1.11.1
sed -i 's/registry.aliyuncs.com\/google_containers//' kubeadm-images-1.30.4.txt
sed -i 's/\[config\/images\] Pulled //' kubeadm-images-1.30.4.txt
for line in $( cat kubeadm-images-1.30.4.txt )
do
result=$(echo ${line} | grep coredns)
if [[ "${result}" == "" ]]
then
k8s_img="registry.k8s.io${line}"
else
k8s_img="registry.k8s.io/coredns${line}"
fi
ali_img="registry.aliyuncs.com/google_containers${line}"
echo "nerdctl -n k8s.io tag ${ali_img} ${k8s_img}"
done
# 删除镜像文档
rm -f kubeadm-images-1.30.4.txt
|
1
|
kubeadm config print init-defaults > kubeadm-init.yaml
|
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 配置 k8s master 主节点地址
advertiseAddress: 10.10.10.111
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
# k8s 主节点访问域名
name: master
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
# k8s 版本
kubernetesVersion: 1.30.4
networking:
dnsDomain: cluster.local
# k8s pod 节点子网
# serviceSubnet: 10.96.0.0/12
serviceSubnet: 10.66.0.0/16
scheduler: {}
---
# 申明 cgroup 用 systemd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
# cgroupfs
cgroupDriver: systemd
failSwapOn: false
---
# 启用 ipvs
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
|
1
|
kubeadm init -v5 --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log
|
- 安装成功后执行初始化命令(为了开始使用集群,运行一下初始化命令作为普通用户)
1
2
3
|
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
|
1
2
3
|
kubeadm join 10.10.10.111:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:21f7e156d57a1882eef6afcff7f30570a371da0061e979e9762828f2d7a4dc0a
|
1
2
3
4
5
6
7
|
kubectl get nodes [-o wide]
# NAME STATUS ROLES AGE VERSION
# master Ready control-plane 3d v1.30.4
# slave1 Ready <none> 3d v1.30.4
# slave2 Ready <none> 3d v1.30.4
# slave3 Ready <none> 3d v1.30.4
|
Kubernetes 安装完成后还不能正常方便使用,还需安装网络和别的插件
Calico kubernetes 安装参考文档
Calico 安装资源 yaml 文件:
修改 custom-resources.yaml 中 CIDR ip 地址池为 kubernetes pod ip 地址池
1
2
|
kubectl create -f calico-tigera-operator-v3.28.1.yaml
kubectl create -f calico-custom-resources-v3.28.1.yaml
|
- 查询 calico 安装后状态,若是状态不对可重启各个节点服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
kubectl get pod -n calico-system [-o wide]
# NAME READY STATUS RESTARTS AGE
# calico-kube-controllers-79f66946bc-265lk 1/1 Running 2 (61m ago) 3d
# calico-node-9wzbl 1/1 Running 2 (61m ago) 3d
# calico-node-fsqmn 1/1 Running 5 (61m ago) 3d
# calico-node-mnbq2 1/1 Running 4 (61m ago) 3d
# calico-node-rgv7w 1/1 Running 4 (62m ago) 3d
# calico-typha-5988f7786d-5kll5 1/1 Running 2 (61m ago) 3d
# calico-typha-5988f7786d-k6wzl 1/1 Running 2 (61m ago) 3d
# csi-node-driver-4wfzg 2/2 Running 4 (62m ago) 3d
# csi-node-driver-7dktt 2/2 Running 4 (61m ago) 3d
# csi-node-driver-dkbwp 2/2 Running 4 (61m ago) 3d
# csi-node-driver-zfx6v 2/2 Running 4 (61m ago) 3d
|
node-js 测试镜像构建,基于 node-js 创建 http 服务, node-server.js 下载链接
1
2
3
4
5
|
FROM node:22.3.0-alpine3.20
COPY node-server.js /node/server.js
WORKDIR /node/
EXPOSE 8080
ENTRYPOINT ["node", "/node/server.js"]
|
1
|
nerdctl -n k8s.io build -t node:v1 .
|
- 测试 pod 和 service -> node-test.yaml
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: node-deployment
labels:
app: node
spec:
selector:
matchLabels:
app: node
template:
metadata:
name: node
labels:
app: node
spec:
containers:
- name: node-pod
image: node:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
replicas: 4
---
apiVersion: v1
kind: Service
metadata:
name: node-service
spec:
type: NodePort
selector:
app: node
ports:
- protocol: TCP
port: 8080
targetPort: 8080
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
kubectl create -f node-test.yaml
# 查看 pod 运行状态
kubectl get pod [-o wide]
> NAME READY STATUS RESTARTS AGE IP NODE
> node-deployment-75dfd6489d-2jr8b 1/1 Running 1 (72m ago) 3d 10.66.140.200 slave1
> node-deployment-75dfd6489d-8kccz 1/1 Running 1 (72m ago) 3d 10.66.140.70 slave2
> node-deployment-75dfd6489d-cr9qm 1/1 Running 1 (72m ago) 3d 10.66.77.7 slave3
> node-deployment-75dfd6489d-zdtbp 1/1 Running 1 (72m ago) 3d 10.66.140.69 slave2
# curl 访问 pod 服务
curl 10.66.140.200:8080/ip
curl 10.66.140.70:8080/interfaces
# 查看 service 运行状态
kubectl get svc
> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
> node-service NodePort 10.96.85.241 <none> 8080:31666/TCP 3d
# curl 通过 service 访问服务
curl 10.96.85.241:8080/ip (通过内部 cluster ip 访问)
curl 10.10.10.111:31666/ip (通过阶段 ip 访问)
|
ingress-nginx git 仓库,ingress-nginx v1.10.4 deploy.yaml git 链接,ingress-nginx v1.11.2 deploy.yaml git 链接
本地 ingress-nginx v1.10.2 下载链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
kubectl create -f ingress-nginx-deploy-v1.10.2.yaml
# 查看 pod 安装状态
kubectl get pod -n ingress-nginx
> NAME READY STATUS RESTARTS AGE
> ingress-nginx-admission-create-tgphn 0/1 Completed 0 3d
> ingress-nginx-admission-patch-z5kw6 0/1 Completed 0 3d
> ingress-nginx-controller-56c555fcb7-7svr4 1/1 Running 1 (90m ago) 3d
# 查看 ingress-nginx 对应 service
kubectl get svc -n ingress-nginx
> NAME TYPE CLUSTER-IP PORT(S) AGE
> ingress-nginx-controller NodePort 10.108.44.190 80:30924/TCP,443:30365/TCP 3d
> ingress-nginx-controller-admission ClusterIP 10.111.3.204 443/TCP 3d
# 访问 curl
curl node.ingress.labs.yzx:30365/ip
|
- ingress-nginx pod 测试 yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# node-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: node-ingress
spec:
ingressClassName: nginx
rules:
- host: node.ingress.labs.yzx
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: node-service
port:
number: 8080
|
1
2
3
|
# 访问 curl , 配置 hosts 域名映射
# 10.10.10.11 node.ingress.labs.yzx
curl node.ingress.labs.yzx:30365/ip
|
kubernetes dashboard v2.7.0 部署 yaml - git, 本 dashboard v2.7.0 下载链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
kubectl create -f https://www.nihility.cn/files/k8s/dashboard-v2.7.0.yaml
# 查看 pod 节点创建状态
kubectl get pod -n kubernetes-dashboard [-o wide]
> NAME READY STATUS RESTARTS AGE
> dashboard-metrics-scraper-795895d745-xxds7 1/1 Running 1 (99m ago) 3d
> kubernetes-dashboard-78f95ff46f-4gk6l 1/1 Running 1 (99m ago) 3d
# 查看 dashboard service 状态
kubectl get svc -n kubernetes-dashboard
> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
> dashboard-metrics-scraper ClusterIP 10.96.77.252 <none> 8000/TCP 3d
> kubernetes-dashboard NodePort 10.98.62.229 <none> 443:30541/TCP 3d
# 编辑 dashboard service 类型为 NodePort
kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard
> type: NodePort
# 访问地址
https://10.10.10.111:30541
|
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
|
cat <<EOF > dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
EOF
# 创建管理员用户
kubectl apply -f dashboard-adminuser.yaml
# 创建角色
cat <<EOF > cluster-role-authorization.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
kubectl apply -f cluster-role-authorization.yml
# 创建 token
kubectl -n kubernetes-dashboard create token admin-user | tee dashboard-token.txt
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
cat <<EOF > dashboard-long-live-bearer-token.yaml
apiVersion: v1
kind: Secret
metadata:
name: admin-user
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token
EOF
kubectl apply -f dashboard-long-live-bearer-token.yaml
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d | tee dashboard-lt-token.txt
|
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
|
# ingress-dashboard.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kubernetes-dashboard
annotations:
# 开启 use-regex,启用 path 的正则匹配
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
# 默认为 true,启用 TLS 时,http请求会 308 重定向到 https
nginx.ingress.kubernetes.io/ssl-redirect: "true"
# 默认为 http,开启后端服务使用 proxy_pass https://协议
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: nginx
rules:
- host: dashboard.ingress.labs.yzx
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 443
|