Kubernetes02-安装Kubernetes(使用kubeadm)
- Kubernetes从1.4版本开始引入了命令行工具kubeadm,致力于简化集群的安装过程,并解决Kubernetes集群的高可用问题。
- 在Kubernetes 1.13版本中,kubeadm工具进入GA阶段,宣称已经为生产环境应用准备就绪。
1、系统要求
1.1、部署环境
- 软件版本
- Kubernetes:各组件的版本是1.20.14
- docker:docker-ce-19.03.10
- 系统环境
- 10.1.1.11:CentOSLinuxrelease7.7.1908(Core)
- 10.1.1.12:CentOSLinuxrelease7.7.1908(Core)
- 10.1.1.13:CentOSLinuxrelease7.7.1908(Core)
- 各个虚拟机的要求
- 核数最少两个
- 内存最少2G
1.2、系统要求
- Kubernetes系统由一组可执行程序组成,用户可以通过GitHub上的Kubernetes项目页下载编译好的二进制包,或者下载源代码并编译后进行安装。
- 安装Kubernetes对软件和硬件的系统要求如表所示:
- Kubernetes需要容器运行时(Container Runtime Interface,CRI)的支持,目前官方支持的容器运行时包括:Docker、Containerd、CRI-O和frakti。
1.3、安装前的准备(所有节点)
1、配置机器主机名
1 2 3 4 5 6 | #在10.1.1.11上执行如下: hostnamectl set - hostname k8s-master1 && bash #在10.1.1.12上执行如下: hostnamectl set - hostname k8s-node1 && bash #在10.1.1.13上执行如下: hostnamectl set - hostname k8s-node2 && bash |
2、配置主机hosts文件,相互之间通过主机名互相访问
- 修改每台机器的/etc/hosts文件,增加如下三行:
1 2 3 4 5 | cat >> /etc/hosts << EOF 10.1.1.11 k8s-master1 10.1.1.12 k8s-node1 10.1.1.13 k8s-node2 EOF |
3、关闭交换分区swap,提升性能
- Swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,初始化k8s的时候可以指定--ignore-preflight-errors=Swap来解决。
1 2 3 4 5 6 7 8 9 | #查看swap状态 free -h #关闭swap,临时有效 swapoff -a #注释掉swap,重启机器,永久有效 vim /etc/fstab #/dev/mapper/centos-swap swap swap defaults 0 0 |
4、修改机器内核参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #加载br_netfilter模块 modprobe br_netfilter echo "modprobe br_netfilter" >> /etc/profile #修改内核参数 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 net.ipv6.conf.all.disable_ipv6 = 1 EOF #使修改的参数生效 sysctl -p /etc/sysctl .d /k8s .conf |
- 问题1:sysctl是做什么的?
- 在运行时配置内核参数。-p从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
- 问题2:为什么要执行modprobe br_netfilter?
- sysctl -p /etc/sysctl.d/k8s.conf出现报错:
- sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
- sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
- sysctl -p /etc/sysctl.d/k8s.conf出现报错:
- 问题3:为什么开启net.bridge.bridge-nf-call-iptables内核参数?
- 在centos下安装docker,执行docker info出现如下警告:
- WARNING: bridge-nf-call-iptables is disabled
- WARNING: bridge-nf-call-ip6tables is disabled
- 在centos下安装docker,执行docker info出现如下警告:
- 问题4:为什么要开启net.ipv4.ip_forward = 1参数?
- kubeadm初始化k8s如果报错:
- [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
- net.ipv4.ip_forward是数据包转发:
- 出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
- 要让Linux系统具有路由转发功能,需要配置一个Linux的内核参数net.ipv4.ip_forward。这个参数指定了Linux系统当前对路由转发功能的支持情况;其值为0时表示
- kubeadm初始化k8s如果报错:
5、关闭firewalld防火墙
- 需要注意的是,CentOS Linux 7默认启动了防火墙服务(firewalld),而Kubernetes的Master与工作Node之间会有大量的网络通信,安全的做法是在防火墙上配置各组件需要相互通信的端口号。
- 在安全的内部网络环境中可以关闭防火墙服务:
1 2 3 4 5 6 | #查看防护墙状态 systemctl status firewalld.service #关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service |
6、关闭selinux
- 禁用SELinux,让容器可以读取主机文件系统:
1 2 3 4 5 6 7 8 | #查看selinux的状态 getenforce #临时有效 setenforce 0 #永久有效。改系统文件/etc/sysconfig/selinux,然后重启机器 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config |
7、配置时间同步
1 2 3 4 | #安装ntpdate yum install ntpdate -y #同步时间 ntpdate ntp1.aliyun.com |
8、开启ipvs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | cat > /etc/sysconfig/modules/ipvs .modules << EOF #!/bin/bash ipvs_modules= "ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" for kernel_module in \${ipvs_modules}; do /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1 if [ 0 - eq 0 ]; then /sbin/modprobe \${kernel_module} fi done EOF chmod 755 /etc/sysconfig/modules/ipvs .modules bash /etc/sysconfig/modules/ipvs .modules #查看是否开启ip_vs lsmod | grep ip_vs |
- 问题1:ipvs是什么?
- ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为 Linux 内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。
- 问题2:ipvs和iptable对比分析
- kube-proxy支持 iptables 和 ipvs 两种模式, 在kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于netfilter的,但是ipvs采用的是hash表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能。
- ipvs模式和iptables模式之间有哪些差异呢?
- 1、ipvs 为大型集群提供了更好的可扩展性和性能
- 2、ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)
- 3、ipvs 支持服务器健康检查和连接重试等功能
9、安装基础包(非必须)
1 2 3 4 5 | yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools \ nfs-utils lrzsz gcc gcc -c++ make cmake libxml2-devel openssl-devel curl \ curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf \ automake zlib-devel python-devel epel-release openssh-server socat ipvsadm \ conntrack ntpdate telnet ipvsadm |
10、安装iptables(非必须)
- 如果用firewalld不习惯,可以安装iptables
1 2 3 4 5 6 | #安装iptables yum install iptables-services -y #禁用iptables service iptables stop && systemctl disable iptables #清空防火墙规则 iptables -F |
11、查看内核版本、cpu核数和内存大小
1 2 3 4 5 6 7 8 | #内核至少要3.10 uname -a #cpu核数最少要2个 cat /proc/cpuinfo | grep "processor" | wc -l #内存大小至少要2G free -h #centos版本最好在7.5以上 cat /etc/redhat-release |
2、配置yum源(所有节点)
1、配置docker的yum源
- http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
1 | wget http: //mirrors .aliyun.com /docker-ce/linux/centos/docker-ce .repo -P /etc/yum .repos.d/ |
2、配置kubernetes的yum源
- 官方yum源的地址
- https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64。
- 如果无法访问官方yum源的地址,可以使用国内的yum源
- http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
- https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/
1 2 3 4 5 6 7 | cat > /etc/yum .repos.d /kubernetes .repo << EOF [kubernetes] name= kubernetes CentOS-7 baseurl=http: //mirrors .aliyun.com /kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF |
3、安装docker(所有节点)
1、安装docker
1 | yum install docker-ce-19.03.10 docker-ce-cli-19.03.10 containerd.io -y |
2、镜像加速和文件驱动器
- 修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认使用systemd,两者必须一致才可以。
- 不修改,在进行初始化master时会有警告信息([Docker SystemdCheck]: detected cgroupfs" as the Docker cgroup dr iver. The r ecommended dr fiver is" systemd")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | mkdir -p /etc/docker/ cat > /etc/docker/daemon .json << EOF { "registry-mirrors" : [ "https://rsbud4vc.mirror.aliyuncs.com" , "https://registry.docker-cn.com" , "https://docker.mirrors.ustc.edu.cn" , "https://dockerhub.azk8s.cn" , "http://hub-mirror.c.163.com" , "http://qtid6917.mirror.aliyuncs.com" , "https://rncxm540.mirror.aliyuncs.com" ], "exec-opts" : [ "native.cgroupdriver=systemd" ] } EOF #查看配置是否生效(启动docker后) docker info |
3、启动docker
1 2 3 4 5 | systemctl daemon-reload systemctl enable docker.service systemctl start docker.service systemctl status docker.service |
- 修改网络参数,将下列文件的值改为1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #要先启动docker,才会有前两个文件 cat /proc/sys/net/bridge/bridge-nf-call-ip6tables cat /proc/sys/net/bridge/bridge-nf-call-iptables cat /proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv6/conf/default/disable_ipv6 cat /proc/sys/net/ipv6/conf/all/disable_ipv6 #修改 echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6 echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 |
4、部署master节点
4.1、安装相关组件和拉去镜像
1、安装master的相关组件
1 2 | #安装应用 yum install kubeadm-1.20.14 kubelet-1.20.14 kubectl-1.20.14 -y |
2、拉取master需要相关镜像
- 默认拉取的是k8s.gcr.io上的镜像(国内不能访问该网站)
1 2 3 4 5 | #列出所需的镜像列表 kubeadm config images list #拉取镜像到本地 kubeadm config images pull #因拉取超时而失败 |
- 使用aliyun的镜像仓库获取镜像
1 | kubeadm config images pull --kubernetes-version v1.20.14 --image-repository registry.aliyuncs.com /google_containers |
4.2、初始化master节点
- 启动kubelet服务
1 2 3 4 5 | systemctl enable kubelet.service #开机自启一定要执行 systemctl start kubelet.service #启动失败,是因为还没有初始化master节点。执行kubeadm init后,其状态就会恢复正常 systemctl status kubelet.service |
- 初始化master节点
- 注意:kubeadm的安装过程不涉及网络插件(CNI)的初始化,因此kubeadm初步安装完成的集群不具备网络功能,任何Pod包括自带的CoreDNS都无法正常工作。
- 网络插件的安装往往对kubeadm init命令的参数有一定的要求。例如,安装Flannel或Calico插件时需要指定--pod-network-cidr的值。
1 2 | kubeadm init --kubernetes-version=v1.20.14 --pod-network-cidr=10.10.0.0 /16 \ --service-cidr=10.20.0.0 /16 --image-repository=registry.aliyuncs.com /google_containers |
-
- --kubernetes-version:指定kubernetes的版本号
- --pod-network-cidr:Pod可以用网络
- --service-cidr:Service可以用的网络
- --image-repository:指定国内的镜像仓库
- 修改/etc/kubernetes/manifests/kube-apiserver.yaml, 在 - --service-cluster-ip-range=10.20.0.0/16的下面加一行。
- 如果不修改,将无法使用较小的端口。(需重启kubelet服务)
1 2 | vim /etc/kubernetes/manifests/kube-apiserver .yaml - --service-node-port-range=1-65355 |
4.3、初始化后的操作
- 让用户可以使用kubectl。
1 2 3 4 5 6 7 8 9 10 11 | #如果是普通用户执行以下命令 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin .conf $HOME/.kube /config sudo chown $( id -u):$( id -g) $HOME/.kube /config #如果是root用户,执行下面命令 #临时有效 export KUBECONFIG= /etc/kubernetes/admin .conf #永久有效 echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile source /etc/profile |
- 保留最后的输出:这是node节点加入集群的凭证,在node上用root用户执行下面的命令就可以加入该集群。
1 2 | kubeadm join 10.1.1.11:6443 --token ck4388.1w2l2356yv8zu4bk \ --discovery-token-ca-cert- hash sha256:4af0b74e59514e0a108dceaa65ce941c971ab1ca92207b7ef8b9c9411a5161dc |
4.4、查看master是否正常
1、显示组件状态信息
1 2 3 4 5 6 | ]# kubectl get cs #或kubectl get componentstatus Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz" : dial tcp 127.0.0.1:10252: connect : connection refused scheduler Unhealthy Get "http://127.0.0.1:10251/healthz" : dial tcp 127.0.0.1:10251: connect : connection refused etcd-0 Healthy { "health" : "true" } |
- 有两个组件是不正常的(Unhealthy),解决方案如下:
1 2 3 4 5 | #删除下面两个文件中的“--port=0” sed -i '/--port=0/d' /etc/kubernetes/manifests/kube-controller-manager .yaml sed -i '/--port=0/d' /etc/kubernetes/manifests/kube-scheduler .yaml #重启kubelet systemctl restart kubelet.service |
2、显示各节点状态信息
- Master为NotReady状态,是因为还没有安装CNI网络插件。
1 2 3 | ]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane,master 3m11s v1.20.14 |
3、查看集群日志
- 此时日志肯定有报错,先忽略
1 2 3 | journalctl -f -u kubelet tail -50 /var/log/messages |
5、部署node节点
1、安装kubeadm和相关工具
1 2 3 4 5 6 7 8 | #安装应用 yum install kubeadm-1.20.14 kubelet-1.20.14 kubectl-1.20.14 -y #启动kubelet服务 systemctl enable kubelet.service systemctl start kubelet.service systemctl status kubelet.service #启动失败,因为还没有加入集群。执行kubeadm join后,其状态就会恢复正常 |
2、将node加入集群
1 2 3 | #master初始化时输出的凭证信息 kubeadm join 10.1.1.11:6443 --token ck4388.1w2l2356yv8zu4bk \ --discovery-token-ca-cert- hash sha256:4af0b74e59514e0a108dceaa65ce941c971ab1ca92207b7ef8b9c9411a5161dc |
3、显示各节点状态信息
- 节点都为NotReady状态,是因为还没有安装CNI网络插件。
1 2 3 4 5 | ]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane,master 5m28s v1.20.14 k8s-node1 NotReady <none> 2m17s v1.20.14 k8s-node2 NotReady <none> 2m33s v1.20.14 |
6、安装网络插件
- CNI网络插件,可以有许多选择,请参考https://kubernetes.io/zh/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model的说明。
- 安装Calico的方法和flannel一样,也是要修改"--pod-network-cidr"对应的参数值。
1、安装网络插件flannel
- 官网:https://github.com/flannel-io/flannel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #下载kube-flannel.yml wget https: //raw .githubusercontent.com /flannel-io/flannel/master/Documentation/kube-flannel .yml #该文件可能下载不了,原因出在“raw.githubusercontent.com”上 #修改kube-flannel.yml中的Network的值,要与初始化时的参数--pod-network-cidr的值一致 net-conf.json: | { "Network" : "10.10.0.0/16" , "Backend" : { "Type" : "vxlan" } } #应用kube-flannel.yml kubectl apply -f kube-flannel.yml |
- kube-flannel.yml文件

--- kind: Namespace apiVersion: v1 metadata: name: kube-flannel labels: pod-security.kubernetes.io/enforce: privileged --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: flannel rules: - apiGroups: - "" resources: - pods verbs: - get - apiGroups: - "" resources: - nodes verbs: - list - watch - apiGroups: - "" resources: - nodes/status verbs: - patch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: flannel roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: flannel subjects: - kind: ServiceAccount name: flannel namespace: kube-flannel --- apiVersion: v1 kind: ServiceAccount metadata: name: flannel namespace: kube-flannel --- kind: ConfigMap apiVersion: v1 metadata: name: kube-flannel-cfg namespace: kube-flannel labels: tier: node app: flannel data: cni-conf.json: | { "name": "cbr0", "cniVersion": "0.3.1", "plugins": [ { "type": "flannel", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true } } ] } net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } --- apiVersion: apps/v1 kind: DaemonSet metadata: name: kube-flannel-ds namespace: kube-flannel labels: tier: node app: flannel spec: selector: matchLabels: app: flannel template: metadata: labels: tier: node app: flannel spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/os operator: In values: - linux hostNetwork: true priorityClassName: system-node-critical tolerations: - operator: Exists effect: NoSchedule serviceAccountName: flannel initContainers: - name: install-cni-plugin #image: flannelcni/flannel-cni-plugin:v1.1.0 for ppc64le and mips64le (dockerhub limitations may apply) image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0 command: - cp args: - -f - /flannel - /opt/cni/bin/flannel volumeMounts: - name: cni-plugin mountPath: /opt/cni/bin - name: install-cni #image: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply) image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2 command: - cp args: - -f - /etc/kube-flannel/cni-conf.json - /etc/cni/net.d/10-flannel.conflist volumeMounts: - name: cni mountPath: /etc/cni/net.d - name: flannel-cfg mountPath: /etc/kube-flannel/ containers: - name: kube-flannel #image: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply) image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr resources: requests: cpu: "100m" memory: "50Mi" limits: cpu: "100m" memory: "50Mi" securityContext: privileged: false capabilities: add: ["NET_ADMIN", "NET_RAW"] env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: EVENT_QUEUE_DEPTH value: "5000" volumeMounts: - name: run mountPath: /run/flannel - name: flannel-cfg mountPath: /etc/kube-flannel/ - name: xtables-lock mountPath: /run/xtables.lock volumes: - name: run hostPath: path: /run/flannel - name: cni-plugin hostPath: path: /opt/cni/bin - name: cni hostPath: path: /etc/cni/net.d - name: flannel-cfg configMap: name: kube-flannel-cfg - name: xtables-lock hostPath: path: /run/xtables.lock type: FileOrCreate
2、等待所有pod正常启动
- 如果发现有状态错误的Pod,则可以执行kubectl --namespace=kubesystem describe pod<pod_name>来查看错误原因,常见的错误原因是镜像没有下载完成。
- 至此,通过kubeadm工具就实现了Kubernetes集群的快速搭建。如果安装失败,则可以执行kubeadm reset命令将主机恢复原状,重新执行kubeadm init命令,再次进行安装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ]# kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-flannel kube-flannel-ds-wcnr6 1/1 Running 0 8m51s kube-flannel kube-flannel-ds-wggzq 1/1 Running 0 8m51s kube-flannel kube-flannel-ds-xq667 1/1 Running 0 8m51s kube-system coredns-7f89b7bc75-72c2x 1/1 Running 0 16m kube-system coredns-7f89b7bc75-f9w6h 1/1 Running 0 16m kube-system etcd-k8s-master1 1/1 Running 0 16m kube-system kube-apiserver-k8s-master1 1/1 Running 0 15m kube-system kube-controller-manager-k8s-master1 1/1 Running 0 13m kube-system kube-proxy-56njb 1/1 Running 0 10m kube-system kube-proxy-89bhn 1/1 Running 0 10m kube-system kube-proxy-k7vk5 1/1 Running 0 16m kube-system kube-scheduler-k8s-master1 1/1 Running 0 13m |
- 此时各节点的状态已经正常了
1 2 3 4 5 | ]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 14m v1.20.14 k8s-node1 Ready <none> 10m v1.20.14 k8s-node2 Ready <none> 10m v1.20.14 |
7、验证Kubernetes集群是否安装完成
- kubeadm在Master上也安装了kubelet,在默认情况下master并不参与工作负载。如果希望master也参与工作负载,则可以执行下面的命令(删除Master的污点 “node-role.kubernetes.io/master”),让Master也作为一个Node:
1 | kubectl taint nodes --all node-role.kubernetes.io /master |
7.1、测试网络
- busybox的pod的yaml文件(test-busybox.yaml)
- 注意,busybox的镜像使用1.28的,不是latest,否者测试coredns会出现不正常的情况

apiVersion: v1 kind: Service metadata: name: test-busybox-svc namespace: default labels: app: test-busybox-svc spec: type: NodePort ports: - port: 54321 targetPort: 54321 nodePort: 54321 protocol: TCP name: http selector: app: test-busybox-pod --- apiVersion: apps/v1 kind: Deployment metadata: name: test-busybox-deployment namespace: default spec: selector: matchLabels: app: test-busybox-pod replicas: 2 template: metadata: labels: app: test-busybox-pod spec: imagePullSecrets: - name: svharborwx containers: - name: test-busybox-container image: busybox:1.28 imagePullPolicy: IfNotPresent command: ["/bin/sleep", "10000000000"] ports: - containerPort: 54321
- 应用test-busybox.yaml文件启动pod
1 2 3 4 5 6 | kubectl apply -f test-busybox.yaml ]# kubectl get pods -A -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES default test-busybox-deployment-5dd4f8dc7f-728tz 1/1 Running 0 35s 10.10.2.3 k8s-node01 < none > < none > default test-busybox-deployment-5dd4f8dc7f-7x6nc 1/1 Running 0 35s 10.10.1.3 k8s-node02 < none > < none > |
1、测试flanel是否正常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ]# kubectl exec test-busybox-deployment-5dd4f8dc7f-728tz -it -- /bin/sh / # ping -c 2 www.baidu.com PING www.baidu.com (180.101.49.11): 56 data bytes 64 bytes from 180.101.49.11: seq=0 ttl=50 time=10.409 ms 64 bytes from 180.101.49.11: seq=1 ttl=50 time=7.748 ms --- www.baidu.com ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 7.748/9.078/10.409 ms / # ping -c 2 10.10.1.3 PING 10.10.1.3 (10.10.1.3): 56 data bytes 64 bytes from 10.10.1.3: seq=0 ttl=62 time=0.599 ms 64 bytes from 10.10.1.3: seq=1 ttl=62 time=0.405 ms --- 10.10.1.3 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.405/0.502/0.599 ms |
2、测试coredns是否正常
- 查看服务名称及其IP地址
1 2 3 4 | ]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.20.0.1 < none > 443/TCP 93m test-busybox-svc NodePort 10.20.113.164 < none > 54321:54321/TCP 4m43s |
- 测试dns
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ]# kubectl exec test-busybox-deployment-5dd4f8dc7f-728tz -it -- /bin/sh / # nslookup kubernetes.default.svc.cluster.local Server: 10.20.0.10 Address 1: 10.20.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes.default.svc.cluster.local Address 1: 10.20.0.1 kubernetes.default.svc.cluster.local / # nslookup test-busybox-svc.default.svc.cluster.local Server: 10.20.0.10 Address 1: 10.20.0.10 kube-dns.kube-system.svc.cluster.local Name: test-busybox-svc.default.svc.cluster.local Address 1: 10.20.113.164 test-busybox-svc.default.svc.cluster.local / # nslookup www.baidu.com Server: 10.20.0.10 Address 1: 10.20.0.10 kube-dns.kube-system.svc.cluster.local Name: www.baidu.com Address 1: 110.242.68.3 Address 2: 110.242.68.4 |
7.2、搭建一个应用实例
1、创建pod用的yaml文件(test-nginx.yaml)

apiVersion: v1 kind: Service metadata: name: test-nginx-svc namespace: default labels: app: test-nginx-svc spec: type: NodePort ports: - port: 8080 targetPort: 80 nodePort: 8080 protocol: TCP name: http selector: app: test-nginx-pod --- apiVersion: apps/v1 kind: Deployment metadata: name: test-nginx-deployment namespace: default spec: selector: matchLabels: app: test-nginx-pod replicas: 2 template: metadata: labels: app: test-nginx-pod spec: imagePullSecrets: - name: svharborwx volumes: - name: html hostPath: path: /apps/html containers: - name: test-nginx-container image: nginx:latest imagePullPolicy: IfNotPresent command: ["/usr/sbin/nginx", "-g", "daemon off;"] ports: - containerPort: 80 volumeMounts: - mountPath: /usr/share/nginx/html name: html
2、创建index.html文件
1 2 | mkdir -p /apps/html echo "< h1 >11</ h1 >" > /apps/html/index.html |
3、启动pod
1 | kubectl apply -f test-nginx.yaml |
4、访问
1 | curl http://10.1.1.11:8080/index.html |
1
1 | # # |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?