安装k8s 1.29单机版

hello-world / 2024-03-01 / 原文

单机版环境设置

版本信息

  • kubernetes: 1.29.2
  • etcd: 3.5.10
  • 容器运行时:containerd 1.6.28
  • 虚拟机系统:centos 7.9
  • 虚拟机内核版本:5.4.238-1.el7.elrepo.x86_64

虚拟机设置

  • 参考:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
  • 设置主机名
# dev:
hostnamectl set-hostname kube-master
  • 设置hosts
cat >> /etc/hosts <<EOF
192.168.76.135 kube-master
EOF

  • 自动同步时间
yum -y install ntp
systemctl start ntpd
systemctl enable ntpd
  • 关闭firewalld, selinux, swap
systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

  • 启用ip_vs模块
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
modprobe overlay
modprobe br_netfilter

cat > /etc/modules-load.d/ip_vs.conf << EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
overlay
br_netfilter
EOF

  • 安装ipvsadm
yum install ipvsadm -y
  • 调整内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system

安装基础组件

  • 安装containerd
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install containerd -y

containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sed -i 's#sandbox_image =.*#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
sed -i '/.*plugins."io.containerd.grpc.v1.cri".registry.mirrors.*/ a\        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]\n          endpoint = ["https://registry.aliyuncs.com/google_containers"]\n        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]\n          endpoint = ["https://registry.aliyuncs.com/google_containers"]\n        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\n          endpoint = ["https://usydjf4t.mirror.aliyuncs.com"]' /etc/containerd/config.toml

systemctl start containerd
systemctl enable containerd
systemctl status containerd

  • 安装kubeadm、kubelet 和 kubectl
cat <<EOF > /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
EOF

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet
# kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。

  • 安装kubernetes-cni
yum install -y kubernetes-cni
  • 配置kubectl命令补全
yum install bash-completion -y
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

安装k8s单机版【如需重新安装,可反复执行此部分】

  • 何时需要重置k8s集群

    • 安装失败,需要反复调试
    • 物理机死机后强制关机,导致etcd数据丢失
    • 测试新组件,如新的网络组件、存储组件、容器运行时等
  • 重置k8s集群

kubeadm reset
rm -rf $HOME/.kube
ipvsadm --clear
  • 预下载基础镜像
[root@kube-master ~]# kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.26.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.26.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.26.0
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.6-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.9.3

  • 初始化k8s集群

    • 参考:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
    • 安装:
    kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers
    
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    
    # coredns处于pending状态,等待安装网络组件
    kubectl get pods -n kube-system
    
    
  • 移除控制节点的污点

    kubectl taint node kube-master node-role.kubernetes.io/control-plane:NoSchedule-
    
  • 安装flannel网络组件

    • 参考:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/#networking-and-network-policy
    • 特点:安装速度快,网络性能一般,适合小规模k8s集群。
    • 安装:
    kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
    
    kubectl get pods -n kube-flannel
    
    
  • 测试k8s集群

[root@kube-master ~]# cd yaml/test/
[root@kube-master test]# cat 1-two-pod-volume.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp1
spec:
  containers:
  - name: tomcat
    image: "tomcat"
    ports:
    - containerPort:  8080
      name:  http
    volumeMounts:
    - name: app-logs
      mountPath: /usr/local/tomcat/logs
  - name: busybox
    image: busybox
    command: ["sh", "-c", "tail -f /logs/catalina*.log"]
    volumeMounts:
    - name: app-logs
      mountPath: /logs
  volumes:
    - name: app-logs
      emptyDir: {}
  restartPolicy: Always
[root@kube-master test]# 
[root@kube-master ~]# kubectl apply -f pod-myapp.yaml 
pod/myapp1 created
[root@kube-master test]# kubectl get pods
NAME     READY   STATUS              RESTARTS   AGE
myapp1   0/2     ContainerCreating   0          8s
[root@kube-master test]# kubectl get pods
NAME     READY   STATUS    RESTARTS   AGE
myapp1   2/2     Running   0          2m7s
[root@kube-master test]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
myapp1   2/2     Running   0          3m37s   10.244.0.6   kube-master   <none>           <none>
[root@kube-master test]# curl 10.244.0.6:8080
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>[root@kube-master test]# 
[root@kube-master test]# 
[root@kube-master test]# 
[root@kube-master test]# kubectl logs myapp1 -c busybox
01-Mar-2024 02:47:53.084 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
01-Mar-2024 02:47:53.112 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
01-Mar-2024 02:47:53.112 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
01-Mar-2024 02:47:53.129 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
01-Mar-2024 02:47:54.418 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
01-Mar-2024 02:47:54.507 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [2267] milliseconds
01-Mar-2024 02:47:54.749 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
01-Mar-2024 02:47:54.750 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
01-Mar-2024 02:47:54.781 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
01-Mar-2024 02:47:54.828 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [320] milliseconds
[root@kube-master test]#