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、配置机器主机名

#在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文件,增加如下三行:
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来解决。
#查看swap状态
free -h

#关闭swap,临时有效
swapoff -a

#注释掉swap,重启机器,永久有效
vim /etc/fstab
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

4、修改机器内核参数

#加载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
  • 问题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
  • 问题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时表示

5、关闭firewalld防火墙

  • 需要注意的是,CentOS Linux 7默认启动了防火墙服务(firewalld),而Kubernetes的Master与工作Node之间会有大量的网络通信,安全的做法是在防火墙上配置各组件需要相互通信的端口号。
  • 在安全的内部网络环境中可以关闭防火墙服务
#查看防护墙状态
systemctl status firewalld.service

#关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

6、关闭selinux

  • 禁用SELinux,让容器可以读取主机文件系统:
#查看selinux的状态
getenforce 

#临时有效
setenforce 0

#永久有效。改系统文件/etc/sysconfig/selinux,然后重启机器
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

7、配置时间同步

#安装ntpdate
yum install ntpdate -y
#同步时间
ntpdate ntp1.aliyun.com

8、开启ipvs

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、安装基础包(非必须)

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
#安装iptables
yum install iptables-services -y
#禁用iptables
service iptables stop && systemctl disable iptables
#清空防火墙规则
iptables -F

11、查看内核版本、cpu核数和内存大小

#内核至少要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
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/
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

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")
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

systemctl daemon-reload
systemctl enable docker.service
systemctl start docker.service

systemctl status docker.service
  • 修改网络参数,将下列文件的值改为1
#要先启动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的相关组件

#安装应用
yum install kubeadm-1.20.14 kubelet-1.20.14 kubectl-1.20.14 -y

2、拉取master需要相关镜像

  • 默认拉取的是k8s.gcr.io上的镜像(国内不能访问该网站)
#列出所需的镜像列表
kubeadm config images list

#拉取镜像到本地
kubeadm config images pull    #因拉取超时而失败
  • 使用aliyun的镜像仓库获取镜像
kubeadm config images pull --kubernetes-version v1.20.14 --image-repository registry.aliyuncs.com/google_containers

4.2、初始化master节点

  • 启动kubelet服务
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的值。
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服务)
vim /etc/kubernetes/manifests/kube-apiserver.yaml
    - --service-node-port-range=1-65355

4.3、初始化后的操作

  • 让用户可以使用kubectl
#如果是普通用户执行以下命令
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用户执行下面的命令就可以加入该集群。
kubeadm join 10.1.1.11:6443 --token ck4388.1w2l2356yv8zu4bk \
    --discovery-token-ca-cert-hash sha256:4af0b74e59514e0a108dceaa65ce941c971ab1ca92207b7ef8b9c9411a5161dc

4.4、查看master是否正常

1、显示组件状态信息

]# 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),解决方案如下:
#删除下面两个文件中的“--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网络插件
]# kubectl get nodes
NAME         STATUS     ROLES                  AGE     VERSION
k8s-master   NotReady   control-plane,master   3m11s   v1.20.14

3、查看集群日志

  • 此时日志肯定有报错,先忽略
journalctl -f -u kubelet

tail -50 /var/log/messages

5、部署node节点

1、安装kubeadm和相关工具

#安装应用
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加入集群

#master初始化时输出的凭证信息
kubeadm join 10.1.1.11:6443 --token ck4388.1w2l2356yv8zu4bk \
    --discovery-token-ca-cert-hash sha256:4af0b74e59514e0a108dceaa65ce941c971ab1ca92207b7ef8b9c9411a5161dc

3、显示各节点状态信息

  • 节点都为NotReady状态,是因为还没有安装CNI网络插件
]# 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
#下载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
View Code

2、等待所有pod正常启动

  • 如果发现有状态错误的Pod,则可以执行kubectl --namespace=kubesystem describe pod<pod_name>来查看错误原因,常见的错误原因是镜像没有下载完成。
  • 至此,通过kubeadm工具就实现了Kubernetes集群的快速搭建。如果安装失败,则可以执行kubeadm reset命令将主机恢复原状,重新执行kubeadm init命令,再次进行安装。
]# 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
  • 此时各节点的状态已经正常了
]# 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
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
View Code
  • 应用test-busybox.yaml文件启动pod
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是否正常

]# 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地址
]# 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
]# 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
View Code

2、创建index.html文件

mkdir -p /apps/html
echo "<h1>11</h1>" > /apps/html/index.html

3、启动pod

kubectl apply -f test-nginx.yaml

4、访问

curl http://10.1.1.11:8080/index.html

1

#                                                                                                                       #
posted @ 2022-02-27 18:25  麦恒  阅读(902)  评论(0编辑  收藏  举报