Kubernetes(一)-基础介绍与环境搭建

本文最后更新于:2024年4月22日 下午

Kubernetes 介绍、主要功能、本地虚拟机环境搭建、

Kubernetes介绍

希腊语:舵手、飞行员

  • Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。2015年7月,Kubernetes v1.0正式发布。

  • Kubernetes作为一个容器集群管理系统,用于管理容器云平台中多个主机上的容器应用,Kubernetes的目标是让部署容器化的应用变得简单且高效,所以 Kubernetes 提供了应用部署,规划,更新,维护的一整套完整的机制。

  • 除了Docker容器之外,Kubernetes还支持其他多种容器,如 Containerd、rkt、CoreOS 等

认识Kubernetes

起源

  • 源自于谷歌Borg

  • 使用golang语言开发

  • 简称为k8s

归属

现归属于CNCF

  • 云原生(CloudNative)计算基金会

  • 是一个开源软件基金会,致力于使云计算普遍性和持续性

  • 官方:http://www.cncf.io

kubernetes版本

  • 2014年9月第一个正式版本
  • 2015年7月1.0版本正式发布
  • 现在最新版本为1.27
  • 主要贡献者:Google,Redhat,Microsoft,IBM,Intel
  • 代码托管github:https://github.com/kubernetes/

架构说明

  • Master Node
    • 中心节点
    • manager
    • 简单叫法
      • master节点
  • Minion Node
    • 工作节点
    • worker
    • 简单叫点
      • node节点
      • worker节点

节点组件

Master节点组件

master节点是集群管理中心,它的组件可以在集群内任意节点运行,但是为了方便管理所以会在一台主机上运行Master所有组件,并且不在此主机上运行用户容器

Master组件包括:

  • kube-apiserver

​ 用于暴露kubernetes API,任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。

  • kube-controller-manager

​ 控制器管理器,用于对控制器进行管理,它们是集群中处理常规任务的后台线程。

  • kube-scheduler

    监视新创建没有分配到Node的Pod,为Pod选择一个Node运行。

  • ETCD

    是kubernetes提供默认的存储系统,保存所有集群数据。

Node节点组件

node节点用于运行以及维护Pod, 管理volume(CVI)和网络(CNI),维护pod及service等信息

Node组件包括:

  • kubelet
    • 负责维护容器的生命周期(创建pod,销毁pod),同时也负责Volume(CVI)和网络(CNI)的管理
  • kube-proxy
    • 通过在主机上维护网络规则并执行连接转发来实现service(iptables/ipvs)
    • 随时与apiserver通信,把Service或Pod改变提交给apiserver,保存至etcd(可做高可用集群)中,负责service实现,从内部pod至service和从外部node到service访问。
  • Container Runtime
    • 容器运行时(Container Runtime)
    • 负责镜像管理以及Pod和容器的真正运行
    • 支持docker/containerd/Rkt/Pouch/Kata等多种运行时

Kubernetes环境搭建

使用kubeadm本地化部署目前最新版本kubernetes版本1.27,其他部署方式也可以使用kubeaszkubekey 等方式部署

Linux环境准备

主机系统说明

使用VMware来搭建虚拟机, aliyun镜像库 https://developer.aliyun.com/mirror/

centos7下载链接:https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2207-02.iso

虚拟机IP配置

参考:https://www.cnblogs.com/mayhot/p/15964506.html

修改ip的方式

# cd到网络配置文件路径
cd /etc/sysconfig/network-scripts/
# 编辑ifcfg-en33
vi ifcfg-en33
# 重启网卡
systemctl restart network
# 查看ip
ip addr
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=56d45dc8-a17d-4eca-852c-97167c783f01
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.11
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=192.168.100.2
DNS2=114.114.114.114

改动如下 IPADDR自己分配 、GATEWAY 查看虚拟机的网络NAT网络配置

BOOTPROTO=static

ONBOOT=yes
IPADDR=192.168.100.11
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=192.168.100.2
DNS2=114.114.114.114

如果重启网络还是连接不上,可能是NetworkManager导致的,关闭这个服务

systemctl stop NetworkManager
systemctl disable NetworkManager

参考:https://www.cnblogs.com/python-wen/p/11607969.html

我这里采用静态IP配置,网关设值为192.168.100.0 掩码是255.255.255.0 所以后续分配ip 就可以从 192.168.100.1~192.168.100.255

主机硬件配置说明

IP CPU 内存 硬盘 主机名
192.168.100.11 4C 6G 50g master01
192.168.100.12 4C 6G 50g worker01
192.168.100.13 4C 6G 50g worker02

注意:这里分配6g内存并不会直接占用系统6g内存给当前虚拟机使用,而是动态去申请的

配置方式从原生的静态IP的纯净的系统中关机,克隆。克隆后重新设置静态ip,然后重启,使用shell工具链接,我这里使用FinalShell链接。

准备工作

主机名配置
# 设置主机名
hostnamectl set-hostname xxx
主机名与IP地址解析
# 在hosts后面追加内容
vi /etc/hosts
192.168.100.11 master01
192.168.100.12 worker01
192.168.100.13 worker02
关闭防火墙配置
systemctl disable firewalld
systemctl stop firewalld
firewall-cmd --state
SELINUX配置

SELinux在Kubernetes中的作用是提供额外的安全层,增强容器化应用程序和整个集群的安全性。它限制容器的访问权限、提供安全策略、保护文件系统,并记录安全事件,有助于保护集群免受恶意行为和攻击。

sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
时间同步设置
yum install ntpdate -y
ntpdate time1.aliyun.com
配置内核转发及网桥过滤

添加内核转发及网桥过滤配置文件

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
vm.swappiness = 0
EOF

加载内核转发及网桥过滤配置文件

sysctl -p /etc/sysctl.d/k8s.conf
安装ipset及ipvsadm

主要用于实现service转发。

安装ipset、ipvsadm

yum -y install ipset ipvsadm

配置ipvsadm模块加载方式

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

授权、运行、检查是否加载

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
关闭swap分区

在下面这行添加#注释

vi /etc/fstab

# /dev/mapper/centos-swap swap                    swap    defaults        0 0

安装版本说明

k8s官方于 2020 年 12 月宣布弃用 dockershim,此后k8s从 1.2.0 到 1.2.3 版本如果使用 Docker 作为容器运行时会在 kubelet 启动时会打印一个弃用的警告日志,而最终k8s官方在 2022 年 4 月 的 Kubernetes 1.24 版本中完全移除了 dockershim(弃用dockershim相关问题官方说明

k8s官方在1.24版本以后移除了docker ,后续采用k8s+containerd方式进行搭配使用,如果后续还需使用docker 需要安装cri-docker 其实也就是k8s+docker+cri-docker

对于 k8s+containerd 和 k8s+docker 的两种方案网上也有网友进行了性能测试对比,前者的运行速度、效率都要比后者高,且各大公有云厂商也都往 containerd 切换,因此 k8s+containerd 的组合就成了目前最合适的方案了

我们这里第一简单安装采用低版本的k8s+docker就行,后续会继续出一篇新版本 k8s1.27版本的来做

版本如下:

查阅地址:https://github.com/kubernetes/kubernetes/blob/release-1.22/build/dependencies.yaml

kubernetes 1.21.0+docker 20.10

Docker环境准备(所有节点均需要安装)

docker 20.10 版本安装

获取yum 源

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 列出所有的docker 版本 选择指定的版本安装
yum list docker-ce.x86_64 --showduplicates | sort -r

安装Docker

# --setopt=obsoletes=0  告诉Yum在处理软件包依赖关系时不考虑旧的或过时的软件包
yum -y install --setopt=obsoletes=0 docker-ce-20.10.23-3.el7

设置docker开机启动并启动docker

# 开机启动
systemctl enable docker
# 启动docker
systemctl start docker

修改cgroup方式

cgroup(控制组)是一种用于限制和隔离资源的Linux内核功能。它允许您在共享的主机上为容器分配和管理资源,例如CPU、内存、磁盘和网络等

# 在/etc/docker/daemon.json添加如下内容
vi /etc/docker/daemon.json
{
        "exec-opts": ["native.cgroupdriver=systemd"]
}

配置docker镜像加速

# 在/etc/docker/daemon.json添加"registry-mirrors": ["https://jjwt39jg.mirror.aliyuncs.com"]
# 下面为当前最终版本
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
  	"https://jjwt39jg.mirror.aliyuncs.com",
  	"https://registry.docker-cn.com",
	"http://hub-mirror.c.163.com",
	"https://docker.mirrors.ustc.edu.cn"
  ]
}

重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

dokcer卸载

#杀死所有运行容器
docker kill $(docker ps -a -q)
#删除所有容器
docker rm $(docker ps -a -q)
#删除所有镜像
docker rmi $(docker images -q)

#停止docker相关服务
sudo systemctl stop docker.socket
sudo systemctl stop docker.service

#停止docker服务
systemctl stop docker

#删除存储目录
rm -rf /etc/docker
rm -rf /run/docker
rm -rf /var/lib/dockershim
rm -rf /var/lib/docker

#查看docker 安装的包
yum list installed | grep docker

# 卸载docker相关安装包
yum remove docker-*

安装containerd

我们当前安装 kubernetes 1.21.0+docker 20.10,此步骤跳过

安装依赖软件包

yum -y install yum-utils device-mapper-persistent-data lvm2

添加阿里Docker源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

添加overlay和netfilter模块

cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

安装Containerd,这里安装最新版本

yum -y install containerd.io

创建Containerd的配置文件

mkdir -p /etc/containerd
 
containerd config default > /etc/containerd/config.toml
 
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
 
sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml

启动containerd

systemctl enable containerd
systemctl start containerd

验证containerd是否安装成功

containerd -v

Kubernetes 1.21.0 (单master)集群部署

kubeadm、kubelet、kubectl安装

kubeadm kubelet kubectl
版本 1.21.0 1.21.0 1.21.0
安装位置 集群所有主机 集群所有主机 集群所有主机
作用 初始化集群、管理集群等 用于接收api-server指令,对pod生命周期进行管理 集群应用命令行管理工具
配置yum源
# k8s源,没有就创建
vi /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=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安装
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
配置kubelet

保证docker使用的cgroupdriver与kubelet使用的cgroup的一致性

# vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置kubelet为开机自启动并启动
systemctl enable kubelet && systemctl restart kubelet

集群初始化(master初始化)

#镜像清理
docker system prune -a
方式一:先下载镜像

集群镜像准备

kubeadm config images list --kubernetes-version=v1.21.0

#返回如下
k8s.gcr.io/kube-apiserver:v1.21.0
k8s.gcr.io/kube-controller-manager:v1.21.0
k8s.gcr.io/kube-scheduler:v1.21.0
k8s.gcr.io/kube-proxy:v1.21.0
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0

脚本下载

官网 k8s.gcr.io 由于网络原因下载不下来

这里选用镜像下载

registry.cn-hangzhou.aliyuncs.com/google_containers/ 该镜像中 pause:3.4.1和 etcd:3.4.13-0 找不到 原因目前未知

registry.aliyuncs.com/google_containers/ 目前可行 就用它了

# vi image_download.sh

#!/bin/bash
images_list='
registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.21.0
registry.aliyuncs.com/google_containers/pause:3.4.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0

for i in $images_list
do
        docker pull $i
done

docker save -o k8s-1-27-0.tar $images_list

执行

sh image_download.sh

然后执行集群初始化

kubeadm init --kubernetes-version=v1.21.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.100.11
遇到的问题

方式一执行集群初始化的时候还是会走k8s.gcr.io,所以应该从阿里云下下来后,重新tag 打成 k8s.gcr.io下面的包再执行初始化

方式二:使用阿里云镜像
kubeadm init --kubernetes-version=v1.21.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.100.11 --image-repository=registry.aliyuncs.com/google_containers
遇到的问题

failed to pull image registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0

原因:

安装时需要从 k8s.gcr.io 拉取镜像,但是该网站被我国屏蔽了,国内没法正常访问导致没法正常进行kubernetes正常安装,从Docker官方默认镜像平台拉取镜像并重新打tag的方式来绕过对 k8s.gcr.io 的访问

#从docker官网拉取
docker pull coredns/coredns:1.8.0
#重新打标签
docker tag coredns/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
# 删除旧的镜像
docker rmi coredns/coredns:1.8.0

此时会生成从节点加入主节点的链接

[init] Using Kubernetes version: v1.21.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master01] and IPs [10.96.0.1 192.168.100.11]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost master01] and IPs [192.168.100.11 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost master01] and IPs [192.168.100.11 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
[apiclient] All control plane components are healthy after 56.002741 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.21" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node master01 as control-plane by adding the labels: [node-role.kubernetes.io/master(deprecated) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node master01 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: 4x919n.wofqxskn85v5skmj
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.100.11:6443 --token 4x919n.wofqxskn85v5skmj \
        --discovery-token-ca-cert-hash sha256:d0f8229aec07486e0f42181ef44069762b57910f1dd8d78edb9b5e64ccf82b9c 

然后更新生成的信息 主节点执行(master01执行)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

export KUBECONFIG=/etc/kubernetes/admin.conf

两个从节点(worker01,worker02)执行加入操作,然后在两个从节点 worker01 和worker02上使用kubeadm 加入操作

kubeadm join 192.168.100.11:6443 --token 4x919n.wofqxskn85v5skmj \
        --discovery-token-ca-cert-hash sha256:d0f8229aec07486e0f42181ef44069762b57910f1dd8d78edb9b5e64ccf82b9c 

如果加入报错节点存在可以执行重置后重新加入 kubeadm reset

如果忘了可以使用下面的这行命令重新生成

kubeadm token create --print-join-command

在主节点上查看从节点是否加入

kubectl  get node

集群网络准备

使用calico部署集群网络

安装参考网址:https://projectcalico.docs.tigera.io/about/about-calico

https://docs.tigera.io/archive/v3.23/getting-started/kubernetes/requirements 介绍

我们这里k8s用的版本是1.21.0 所对应的calico 版本是v3.23

第一种:基于operator安装calico
下载operator资源清单文件

如果不能直接应用(网络原因 可以先找个下载下来再使用apply应用)

# 网络原因,宿主机(需要具备访问的条件)手动访问下面地址,将里面的内容放到tigera-operator.yaml中
https://projectcalico.docs.tigera.io/archive/v3.23/manifests/tigera-operator.yaml
mkdir calicodir
cd calicodir
# 应用资源清单文件,创建operator  
kubectl apply --server-side -f tigera-operator.yaml

上面文件过大 --server-side 目的解决 tigera-operator.yaml 过大导致创建失败的问题,停止使用 Client Side Apply(运行 kubectl apply 时的当前默认设置),而是使用 Server Side Apply,它不会将 last-applied-configuration 注释添加到对象。

kubectl delete -f tigera-operator.yaml 先删除再创建也可以

参考:https://www.cnblogs.com/lzjloveit/p/17223453.html

# 网络原因,宿主机(需要具备访问的条件)手动访问下面地址,将里面的内容放到custom-resources.yaml中
https://projectcalico.docs.tigera.io/archive/v3.23/manifests/custom-resources.yaml
#打开 custom-resources.yaml文件将cidr 改为上面 kubeadm 初始化的时候设置的 --pod-network-cidr的配置信息
cidr: 192.168.0.0/16  改为      cidr: 10.244.0.0/16 

# 执行是需要保证上面tigera-operator.yaml 已经执行成功
kubectl apply -f custom-resources.yaml
第二种:基于calico.yml安装
下载calico配置文件

这里 也是使用3.23版本

wget  https://docs.projectcalico.org/v3.23/manifests/calico.yaml  --no-check-certificate

这里下载不下来就本地下载后传入服务器

修改配置文件
vi calico.yaml
将
# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"
修改为
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"


#然后直接搜索 CLUSTER_TYPE,找到下面这段
- name: CLUSTER_TYPE
   value: "k8s,bgp"
#然后添加一个和 CLUSTER_TYPE 同级的IP_AUTODETECTION_METHOD字段,具体如下:
# value 就是指定你的网卡名字,我这里网卡是 ens33,然后直接配置的通配符 ens.*
- name: IP_AUTODETECTION_METHOD  
  value: "interface=ens.*"

重点注意:这里不能添加时候不能使用tab只能使用空格键当做空格,不然创建的时候会报错

手动加载镜像(由于网络原因)
[root@master01 calicodir]# cat calico.yaml |grep 'image:'
          image: docker.io/calico/cni:v3.23.5
          image: docker.io/calico/cni:v3.23.5
          image: docker.io/calico/node:v3.23.5
          image: docker.io/calico/node:v3.23.5

calico 用的是3.23.5版本

手动下载,后上传服务器解压,cd 到images目录,使用 docker load -i xxxx.tar 将镜像载入到当前服务器中

https://github.com/projectcalico/calico/releases/tag/v3.23.5

修改calico 文件

修改镜从阿里云上海地区拉取

cat calico.yaml |grep 'image:'
# 此操作会保证当前calico配置文件使用的镜像和当前载入的镜像名一致
sed -i 's#docker.io/##g' calico.yaml
执行创建calico.yaml创建网络
kubectl apply -f calico.yaml

参考:

验证网络情况删除重装相关
停止kubelet服务
systemctl stop kubelet
systemctl disable kubelet
使用 kubeadm 重置
kubeadm reset
卸载相关应用
sudo yum remove -y kubeadm kubectl kubelet kubernetes-cni kube*   
sudo yum autoremove -y
配置清理
rm -rf /etc/systemd/system/kubelet.service
rm -rf /etc/systemd/system/kube*
手动清理kubernetes
sudo rm -rf ~/.kube
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/kube*

此时删除失败会有占用 可执行 umount $(df -HT | grep '/var/lib/kubelet/pods' | awk '{print $7}') 后再清理

子节点(worker01、worker02)加入主节点(master01)

kubeadm join 192.168.100.11:6443 --token vcc8xt.lc2t495ujjjf4yr9 --discovery-token-ca-cert-hash sha256:d0f8229aec07486e0f42181ef44069762b57910f1dd8d78edb9b5e64ccf82b9c

注意:子节点也需要通过docker load -i xxx.tar 加载calico镜像

然后删除现有的cali-node 会自动重启

[root@master01 ~]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-74df58766b-sxtsr   1/1     Running   2          79m
kube-system   calico-node-llkns                          1/1     Running   2          79m
kube-system   calico-node-sths7                          1/1     Running   0          8m32s
kube-system   calico-node-t2mnv                          1/1     Running   0          13s
kube-system   coredns-545d6fc579-p2f8r                   1/1     Running   2          6h57m
kube-system   coredns-545d6fc579-wl8dn                   1/1     Running   2          6h57m
kube-system   etcd-master01                              1/1     Running   6          6h58m
kube-system   kube-apiserver-master01                    1/1     Running   6          6h58m
kube-system   kube-controller-manager-master01           1/1     Running   6          6h58m
kube-system   kube-proxy-87l6q                           1/1     Running   0          28m
kube-system   kube-proxy-c5r5l                           1/1     Running   5          6h57m
kube-system   kube-proxy-vb8w9                           1/1     Running   0          29m
kube-system   kube-scheduler-master01                    1/1     Running   5          6h58m

删除命令

kubectl delete pod calico-node-xxx -n kube-system

常用基础命令

#查看所有的节点
kubectl get nodes

#真实情况
kubectl get cs

#查看管理相关的pod运行情况(calico也在这有版本再 calico-system)
kubectl get pods -n kube-system

部署应用Nginx

先部署一个nginx,后续详细学习其中应用 service中的yaml参数含义以及写法

#创建一个nginx目录
mkdir nginx
cd nginx
# vi nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
spec:
  selector:
    matchLabels:
      app: nginx
      env: test
      owner: root
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
        env: test
        owner: root
    spec:
      containers:
        - name: nginx-test
          image: nginx:1.19.9
          ports:
            - containerPort: 80

执行创建应用

kubectl apply -f nginx.yaml
# vi nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-test
  labels:
    run: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
  selector:
    owner: root

执行创建服务

kubectl apply -f nginx-service.yaml

验证是否创建成功

[root@master01 nginx]# kubectl get pods -o wide 
NAME                          READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
nginx-test-7d95fb4447-52j86   1/1     Running   0          18m   10.244.30.66   worker02   <none>           <none>
nginx-test-7d95fb4447-zfbgm   1/1     Running   0          18m   10.244.5.2     worker01   <none>           <none>
[root@master01 nginx]# kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE   SELECTOR
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        24h   <none>
nginx-test   NodePort    10.110.6.84   <none>        80:30518/TCP   18m   owner=rancher

这里对应的30518就是系统默认分配的对外暴露端口

访问 http://192.168.100.11:30518/ 出现nginx首页即成功

安装Dashboard控制面板

github地址 https://github.com/kubernetes/dashboard

mkdir /root/kube-dashboard
cd /root/kube-dashboard
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
# 修改配置文件将
spec:
  ports:
    - port: 443
      targetPort: 8443
#改成
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30000
      
#修改权限将
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard
#改成
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard
    
# 其实就是这里   name: kubernetes-dashboard==》     name: cluster-admin
kubectl apply -f recommended.yaml

[root@master01 kube-dashboard]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   24h
kube-node-lease        Active   24h
kube-public            Active   24h
kube-system            Active   24h
kubernetes-dashboard   Active   39s

[root@master01 kube-dashboard]# kubectl get pods -n kubernetes-dashboard
NAME                                        READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-c45b7869d-lj5gd   1/1     Running   1          23m
kubernetes-dashboard-6bcfd5644-gn7l5        1/1     Running   0          85s


[root@master01 kube-dashboard]# ss -anput|grep ":30000"
tcp    LISTEN     0      128       *:30000                 *:*                   users:(("kube-proxy",pid=27644,fd=13))

Kubernetes(一)-基础介绍与环境搭建
https://hyq965672903.gitee.io/posts/188048a0.html
作者
灼华
发布于
2023年6月12日
许可协议