avatar

安装K8S单节点


Kubernetes v1.24.2 环境准备

如下是基于CentOS7系统部署Kubernetes v1.24.2 版本单节点环境所需要的详细步骤(参考Bootstrapping clusters with kubeadm),其它系统请参考修改:

配置系统参数

1# 配置二层转发时也去调用 iptables 配置的三层规则
2$ cat <<EOF > /etc/sysctl.d/k8s.conf
3net.bridge.bridge-nf-call-ip6tables = 1
4net.bridge.bridge-nf-call-iptables = 1
5EOF
6$ sysctl --system
7# 加载br_netfilter模块
8$ modprobe br_netfilter
9$ lsmod | grep br_netfilter

安装容器运行态

由于从v1.24大版本开始,Kubernetes便不再支持Docker。因此这里我们以containerd为容器运行时来安装演示环境(参考Getting started with containerd):

 1# 安装containerd
 2$ wget https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-amd64.tar.gz
 3$ tar Cxzvf /usr/local containerd-1.6.2-linux-amd64.tar.gz
 4# 通过systemd管理containerd
 5$ wget https://github.com/containerd/containerd/blob/main/containerd.service
 6$ cp containerd.service /usr/local/lib/systemd/system/containerd.service
 7$ systemctl daemon-reload
 8$ systemctl enable --now containerd
 9# 安装runc
10$ wget https://github.com/opencontainers/runc/releases/download/v1.1.3/runc.amd64
11$ install -m 755 runc.amd64 /usr/local/sbin/runc
12# 安装CNI插件
13$ wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
14$ tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
15# 检查安装是否正常
16$ crictl version
17
18# 导出默认配置
19$ containerd config default > /etc/containerd/config.toml    
20# 配置systemd cgroup
21[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
22  ...
23  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
24    SystemdCgroup = true
25# 重启containerd
26$ systemctl restart containerd
27# 检查运行是否正常
28$ crictl version

安装kubeadm、kubelet以及kubectl

 1# 安装yum源
 2$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
 3[kubernetes]
 4name=Kubernetes
 5baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
 6enabled=1
 7gpgcheck=0
 8repo_gpgcheck=0
 9gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
10        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
11EOF
12
13$ yum clean all  
14$ yum makecache  
15$ yum repolist
16
17# 安装kubeadm、kubelet以及kubectl
18$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
19$ systemctl enable --now kubelet
20# attention: should be stopped status
21$ systemctl status kubelet
22
23# 利用kubeadm安装Kubernetes集群(其中x.x.x.x替换为母机IP)
24# 另外注意国内无法访问google镜像仓库,因此需要通过参数image-repository替换镜像源
25$ kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --pod-network-cidr=194.71.0.0/16 --service-cidr=194.70.255.0/24 --kubernetes-version=v1.24.2 --apiserver-advertise-address x.x.x.x --v=5
26
27# 安装成功后执行
28$ mkdir -p $HOME/.kube
29$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
30$ chown $(id -u):$(id -g) $HOME/.kube/config

安装网络插件

1# 下载yaml文件
2$ wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
3# 修改Network参数为'--pod-network-cidr'内容: 194.71.0.0/16
4# 安装flannel CNI插件
5$ kubectl apply -f kube-flannel.yml

部署应用,简单测试

 1# 去污点
 2$ kubectl taint nodes --all node-role.kubernetes.io/master-
 3$ kubectl taint nodes --all node-role.kubernetes.io/control-plane-
 4# 部署nginx deployment
 5$ echo "
 6---
 7apiVersion: v1
 8kind: Service
 9metadata:
10  labels:
11    app: echo
12  name: echo
13spec:
14  ports:
15  - port: 8080
16    name: high
17    protocol: TCP
18    targetPort: 8080
19  - port: 80
20    name: low
21    protocol: TCP
22    targetPort: 8080
23  selector:
24    app: echo
25---
26apiVersion: apps/v1
27kind: Deployment
28metadata:
29  labels:
30    app: echo
31  name: echo
32spec:
33  replicas: 2
34  selector:
35    matchLabels:
36      app: echo
37  strategy: {}
38  template:
39    metadata:
40      creationTimestamp: null
41      labels:
42        app: echo
43    spec:
44      containers:
45      - image: superedge/echoserver:2.2
46        name: echo
47        ports:
48        - containerPort: 8080
49        env:
50          - name: NODE_NAME
51            valueFrom:
52              fieldRef:
53                fieldPath: spec.nodeName
54          - name: POD_NAME
55            valueFrom:
56              fieldRef:
57                fieldPath: metadata.name
58          - name: POD_NAMESPACE
59            valueFrom:
60              fieldRef:
61                fieldPath: metadata.namespace
62          - name: POD_IP
63            valueFrom:
64              fieldRef:
65                fieldPath: status.podIP
66        resources: {}
67" | kubectl apply -f -
68
69$ kubectl get svc
70NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
71echo         ClusterIP   194.70.255.237   <none>        8080/TCP,80/TCP   66s
72$ kubectl get pods -o wide
73NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE               NOMINATED NODE   READINESS GATES
74echo-67b57bb686-lp4ft    1/1     Running   0          2m37s   194.71.0.7   devlop.novalocal   <none>           <none>
75echo-67b57bb686-mch4q    1/1     Running   0          3m23s   194.71.0.6   devlop.novalocal   <none>           <none>
76
77$ curl 194.70.255.237|grep "pod IP"    
78  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
79                                 Dload  Upload   Total   Spent    Left  Speed
80100   501    0   501    0     0   279k      0 --:--:-- --:--:-- --:--:--  489k
81        pod IP: 194.71.0.6
82$ curl 194.70.255.237|grep "pod IP"
83  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
84                                 Dload  Upload   Total   Spent    Left  Speed
85100   501    0   501    0     0   374k      0 --:--:-- --:--:-- --:--:--  489k
86        pod IP: 194.71.0.7

综上,基于v1.24.2版本的单节点Kubernetes环境就部署好了

评论列表:

暂无评论 😭