Kubernetes教程(一)---使用 kubeadm 创建 k8s 集群(containerd)

kubernetes部署(containerd版) 文章目录环境准备安装 Containerd使用 kubeadm 部署 Kubernetes添加节点Dashboard清理 使用 kubeadm 从头搭建一个使用 containerd 作为容器运行时的 Kubernetes 集群,这里我们安装 v1.22.1 版本。 环境准备 节点的 hostname 必须使用标准的 DNS 命名,另外千万不用什么默认的 localhost 的 hostname,会导致各种错误出现的。在 Kubernetes 项目里,机器的名字以及一切存储在 Etcd 中的 API 阅读详情

来自:指月 https://www.lixueduan.com

原文:https://www.lixueduan.com/posts/kubernetes/01-install/

本文记录了使用 kubeadm 从头搭建一个使用 containerd 作为容器运行时的 Kubernetes 集群的过程。


如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注微信公众号。

扫描下方二维码或搜索公众号【探索云原生】即可订阅


本文创建于 2021.3.12,更新于 2022.5.28

推荐使用 KubeClipper 来创建 k8s 集群,一条命令搞定:Kubernetes教程(十一)—使用 KubeClipper 通过一条命令快速创建 k8s 集群

本次实验用到的机器如下:

主机名系统版本内核版本配置IP角色
k8s-1CentOS 7.95.182C4G192.168.2.131master
k8s-2CentOS 7.95.182C4G192.168.2.132worker
k8s-3CentOS 7.95.182C4G192.168.2.133worker

Linux Kernel 版本需要 4.x 以上,否则 calico 可能无法正常启动。

软件版本

  • containerd:1.5.11
    • libseccomp 2.5.1
  • k8s:1.23.5
    • kubeadm
    • kubelet
    • kubectl
  • calico:3.22

各个组件不同版本可能存在不兼容情况,调整组件版本时请注意。

本文主要分为以下几个部分:

  • 1)安装 containerd(所有节点)
  • 2)安装 kubeadm、kubelet、kubectl(所有节点)
  • 3)初始化 master 节点(k8s-1)
  • 4)加入到集群(k8s-2,k8s-3)
  • 5)部署 calico(k8s-1)
  • 6)k8s 简单体验(k8s-1)

0. 安装 containerd

在所有节点上执行该步骤

1. 安装

安装和配置的先决条件:

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 应用 sysctl 参数而无需重新启动
sudo sysctl --system
yum 方式

安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定的存储库。

sudo yum install -y yum-utils

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
   
yum install containerd -y
二进制方式

这里我使用的系统是 CentOS 7.9,首先需要安装 libseccomp 依赖。

先查看系统有没有 libseccomp 软件包

[root@k8s-1 ~]# rpm -qa | grep libseccomp
libseccomp-2.3.1-4.el7.x86_64

centos 7.9 默认安装了 2.3 版本,不过太旧了需要升级

# 卸载原来的
[root@k8s-1 ~]# rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps
#下载高于2.4以上的包
[root@k8s-1 ~]# wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm

#安装
[root@k8s-1 ~]# rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm 
#查看当前版本
[root@k8s-1 ~]# rpm -qa | grep libseccomp
libseccomp-2.5.1-1.el8.x86_64

然后去 containerd 的 release 页面下载对应的压缩包。

https://github.com/containerd/containerd/releases

有两种压缩包

  • containerd-1.5.11-linux-amd64.tar.gz
    • 单独的 containerd
  • cri-containerd-cni-1.5.11-linux-amd64.tar.gz
    • containerd + runc

安装了 containerd 也要安装 runc,所以这里直接下载第二个打包好的就行。

wget https://github.com/containerd/containerd/releases/download/v1.5.11/cri-containerd-cni-1.5.11-linux-amd64.tar.gz

可以通过 tar 的 -t 选项直接看到压缩包中包含哪些文件:

[root@localhost ~]# tar -tf cri-containerd-cni-1.5.11-linux-amd64.tar.gz
etc/
etc/cni/
etc/cni/net.d/
etc/cni/net.d/10-containerd-net.conflist
etc/systemd/
etc/systemd/system/
etc/systemd/system/containerd.service
etc/crictl.yaml
usr/
usr/local/
usr/local/bin/
usr/local/bin/containerd-shim-runc-v2
usr/local/bin/containerd-shim
usr/local/bin/crictl
usr/local/bin/ctr
usr/local/bin/containerd-shim-runc-v1
usr/local/bin/containerd
usr/local/bin/ctd-decoder
usr/local/bin/critest
usr/local/bin/containerd-stress
usr/local/sbin/
usr/local/sbin/runc
...

可以看到里面有 containerd 和 runc ,而且目录也是设置好了的,直接解压到各个目录中去,甚至不用手动配置环境变量。

tar -C / -zxvf cri-containerd-cni-1.5.11-linux-amd64.tar.gz

2. 修改配置

生成默认 containerd 配置文件

sudo mkdir -p /etc/containerd
# 生成默认配置文件并写入到 config.toml 中
containerd config default | sudo tee /etc/containerd/config.toml

使用 systemd cgroup 驱动程序

注意:cri 使用的 cgroup 和 kubelet 使用的 cgroup 最好是一致的,如果使用 kubeadm 安装的那么 kubelet 也默认使用 systemd cgroup。

结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置

vim /etc/containerd/config.toml
# 把配置文件中的 SystemdCgroup 修改为 true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
#一键替换
sed 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

用国内源替换 containerd 默认的 sand_box 镜像,编辑 /etc/containerd/config.toml

[plugins]
  .....
  [plugins."io.containerd.grpc.v1.cri"]
  	...
	sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.5"
#一键替换
# 需要对路径中的/ 进行转移,替换成\/
sed 's/k8s.gcr.io\/pause/registry.aliyuncs.com\/google_containers\/pause/g' /etc/containerd/config.toml

配置镜像加速器地址

然后再为镜像仓库配置一个加速器,需要在 cri 配置块下面的 registry 配置块下面进行配置 registry.mirrors:(注意缩进)

比较麻烦,只能手动替换了

[plugins."io.containerd.grpc.v1.cri".registry]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  # 添加下面两个配置
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
      endpoint = ["https://ekxinbbh.mirror.aliyuncs.com"]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
      endpoint = ["https://gcr.k8s.li"]

3. 测试

启动 containerd

systemctl daemon-reload
systemctl enable containerd --now

启动完成后就可以使用 containerd 的本地 CLI 工具 ctr 和了,比如查看版本:

ctr version

1. k8s 环境准备

在所有节点上执行该步骤

关闭交换空间

不关则会出现以下错误:failed to run Kubelet: running with swap on is not supported, please disable swap!

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

关闭防火墙

systemctl stop firewalld && systemctl disable  firewalld
systemctl stop NetworkManager && systemctl disable  NetworkManager

禁用 SELinux

将 SELinux 设置为 permissive 模式(相当于将其禁用), 这是允许容器访问主机文件系统所必需的

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

允许 iptables 检查桥接流量

确保 br_netfilter 模块被加载。

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

配置 hosts

这里需要根据自己环境的节点 hostname 和 ip 来调整

# hostnamectl set-hostname xxx 修改 hostname
cat >> /etc/hosts << EOF
192.168.2.131 k8s-1
192.168.2.132 k8s-2
192.168.2.133 k8s-3
EOF

2. 安装

2.1 安装 kubeadm、kubelet 和 kubectl

在所有节点上执行该步骤

配置 yum 源

官网提供的 google 源一般用不了,这里直接换成阿里的源:

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

然后执行安装

# --disableexcludes 禁掉除了kubernetes之外的别的仓库
# 由于官网未开放同步方式, 替换成阿里源后可能会有索引 gpg 检查失败的情况, 这时请带上`--nogpgcheck`选项安装
# 指定安装 1.23.5 版本
sudo yum install -y kubelet-1.23.5 kubeadm-1.23.5 kubectl-1.23.5 --disableexcludes=kubernetes --nogpgcheck

kubelet 设置开机启动

sudo systemctl enable kubelet --now 

2.2 初始化主节点

在 k8s-1 上执行该步骤

生成 kubeadm.yaml 文件

首先导出 kubeadm 配置文件并修改

kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

然后对配置文件做以下修改:

  • nodeRegistration.criSocket:1.23.5 版本默认还是用的 docker,由于我们用的是 containerd,所以需要改一下
  • nodeRegistration.name:节点名,改成主节点的主机名(即 k8s-1)
  • localAPIEndpoint.advertiseAddress:这个就是 apiserver 的地址,需要修改为主节点的 IP
  • imageRepository:镜像仓库,默认是国外的地址,需要替换成国内源
  • kubernetesVersion:调整版本号和之前安装的 kubeadm 一致
  • networking.podSubnet:新增子网信息,固定为 192.168.0.0/16,主要方便后续安装 calico

具体如下:

vim kubeadm.yml

修改后 yaml 如下:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 修改为主节点IP地址
  advertiseAddress: 192.168.2.131
  bindPort: 6443
nodeRegistration:
  # 修改为 containerd
  criSocket: /run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  # 节点名改成主节点的主机名
  name: k8s-1
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
# 换成国内的源
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 修改版本号 必须对应

kubernetesVersion: 1.24.1
networking:
  # 新增该配置 固定为 192.168.0.0/16,用于后续 Calico网络插件
  podSubnet: 192.168.0.0/16
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
拉取镜像

查看所需镜像列表

[root@k8s-1 ~]# kubeadm config images list --config kubeadm.yml
registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.5
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.5
registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.5
registry.aliyuncs.com/google_containers/kube-proxy:v1.23.5
registry.aliyuncs.com/google_containers/pause:3.6
registry.aliyuncs.com/google_containers/etcd:3.5.1-0
registry.aliyuncs.com/google_containers/coredns:v1.8.6

先手动拉取镜像

kubeadm config images pull --config kubeadm.yml

有时候发现一直拉不下来,也没有报错,就一直搁这阻塞着,可以通过以下命令测试

# ctr --debug images pull {image}
ctr --debug images pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.5

最后发现直接用 ctr images pull 可以拉下来,那就手动拉吧,脚本如下:

for i in `kubeadm config images list --config kubeadm.yml`;do ctr images pull $i;done
执行初始化

镜像拉取下来后就可以开始安装了

执行以下命令初始化主节点

# --config=kubeadm.yml 指定配置文件
# --upload-certs 上传证书,可以在后续执行加入节点时自动分发证书文件
# tee kubeadm-init.log 将日志保存到文件
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

输出如下:

# 出现这个就说明安装成功了
Your Kubernetes control-plane has initialized successfully!
# 执行下面的命令配置 kubeconfig
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
# 配置 pod 网络的命令
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/
# node 节点加入集群需要执行如下指令
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.2.131:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:d53020265c2bae4f691258966b3d35f99a9cc2dc530514888d85e916b2844525 

按照提示配置 kubeconfig

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

配置好后查看一下 node 状态

[root@k8s-1 ~]# kubectl get node
NAME    STATUS     ROLES           AGE    VERSION
k8s-1   NotReady   control-plane   109s   v1.23.5

状态为 NotReady,因为此时还没有安装网络插件。

2.3 Node节点加入集群

在 k8s-2 和 k8s-3 上执行该步骤,将节点加入到集群中。

将 worker 加入到集群中很简单,只需要在对应节点上安装 kubeadm,kubectl,kubelet 三个工具,然后使用 kubeadm join 命令加入即可。

先在 k8s-2 节点执行

# 这就是前面安装Master节点时日志中的提示
kubeadm join 192.168.2.131:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:d53020265c2bae4f691258966b3d35f99a9cc2dc530514888d85e916b2844525 

输出如下:

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

在 master 节点查询

[root@k8s-1 ~]# kubectl get nodes
NAME    STATUS     ROLES           AGE     VERSION
k8s-1   NotReady   control-plane   3m46s   v1.23.5
k8s-2   NotReady   <none>          20s     v1.23.5

然后把 k8s-3 也加进来

[root@k8s-1 ~]# kubectl get nodes
NAME    STATUS     ROLES           AGE     VERSION
k8s-1   NotReady   control-plane   3m46s   v1.23.5
k8s-2   NotReady   <none>          20s     v1.23.5
k8s-3   NotReady   <none>          17s     v1.23.5

到此基本安装完成,后续就是部署 calico 了。

此时由于没有安装网络插件,所有节点都还处于 NotReady 状态。

2.4 FAQ

1)kubelet 报错找不到节点

Failed while requesting a signed certificate from the master: cannot create certificate signing request: Unauthorized
"Error getting node" err="node \"k8s-master\" not found"

因为第一次安装的时候生成了证书,但是第一次安装失败了,第二次安装 kubeadm 又生成了新证书,导致二者证书对不上,于是出现了 Unauthorized 的错误,然后没有把 node 信息注册到 api server,然后就出现了第二个错误,node not found。

每次安装失败后,都需要执行 kubeadm reset 重置环境。

3. 安装 Calico

3.1 下载配置文件并拉取镜像

所有节点都需要执行该步骤

第一步获取官方给的 yaml 文件

curl https://projectcalico.docs.tigera.io/archive/v3.22/manifests/calico.yaml -O

可能是网络问题,导致 calico 相关镜像一直拉取超时,最终 pod 无法启动,所以建议提前手动拉取镜像。

手动拉取也很慢,不过最终还是会成功,不过直接超时报错。

查看一共需要哪些镜像

[root@k8s-1 ~]# cat calico.yaml |grep docker.io|awk {'print $2'}
docker.io/calico/cni:v3.23.1
docker.io/calico/cni:v3.23.1
docker.io/calico/node:v3.23.1
docker.io/calico/kube-controllers:v3.23.1

手动拉取

for i in `cat calico.yaml |grep docker.io|awk {'print $2'}`;do ctr images pull $i;done

最后查看一下,确定是否拉取下来了

[root@k8s-2 ~]# ctr images ls
REF                                       TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                          LABELS 
docker.io/calico/cni:v3.23.1              application/vnd.docker.distribution.manifest.list.v2+json sha256:26802bb7714fda18b93765e908f2d48b0230fd1c620789ba2502549afcde4338 105.4 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le -      
docker.io/calico/kube-controllers:v3.23.1 application/vnd.docker.distribution.manifest.list.v2+json sha256:e8b2af28f2c283a38b4d80436e2d2a25e70f2820d97d1a8684609d42c3973afb 53.8 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le -      
docker.io/calico/node:v3.23.1             application/vnd.docker.distribution.manifest.list.v2+json sha256:d2c1613ef26c9ad43af40527691db1f3ad640291d5e4655ae27f1dd9222cc380 73.0 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le -  

3.2 配置网卡名

在 k8s-1 上执行该步骤

calico 默认会找 eth0网卡,如果当前机器网卡不是这个名字,可能会无法启动,需要手动配置以下。

[root@k8s-1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

我这里网卡名是 ens33,不符合默认条件,需要修改 calico.yaml 手动指定一下。

vi calico.yaml

然后直接搜索 CLUSTER_TYPE,找到下面这段

- name: CLUSTER_TYPE
   value: "k8s,bgp"

然后添加一个和 CLUSTER_TYPE 同级的 **IP_AUTODETECTION_METHOD **字段,具体如下:

# value 就是指定你的网卡名字,我这里网卡是 ens33,然后直接配置的通配符 ens.*
- name: IP_AUTODETECTION_METHOD  
  value: "interface=ens.*"

3.3 部署

在 k8s-1上执行该步骤

kubectl apply -f calico.yaml

如果不错意外的话等一会 calico 就安装好了,可以通过以下命令查看:

[root@k8s-1 ~]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS        AGE
kube-system   calico-kube-controllers-6c75955484-hhvh6   1/1     Running   0               7m37s
kube-system   calico-node-5xjqd                          1/1     Running   0               7m37s
kube-system   calico-node-6lnd6                          1/1     Running   0               7m37s
kube-system   calico-node-vkgfr                          1/1     Running   0               7m37s
kube-system   coredns-6d8c4cb4d-8gxsf                    1/1     Running   0               20m
kube-system   coredns-6d8c4cb4d-m596j                    1/1     Running   0               20m
kube-system   etcd-k8s-1                                 1/1     Running   0               20m
kube-system   kube-apiserver-k8s-1                       1/1     Running   0               20m
kube-system   kube-controller-manager-k8s-1              1/1     Running   1 (6m16s ago)   20m
kube-system   kube-proxy-5qj6j                           1/1     Running   0               20m
kube-system   kube-proxy-rhwb7                           1/1     Running   0               20m
kube-system   kube-proxy-xzswm                           1/1     Running   0               20m
kube-system   kube-scheduler-k8s-1                       1/1     Running   1 (5m56s ago)   20m

calico 开头的以及 coredns 都跑起来就算完成。

kubectl get pod ${POD_NAME} -n ${NAMESPACE} -o yaml | kubectl replace --force -f -
kubectl get pod calico-node-68fnx -n kube-system -o yaml | kubectl replace --force -f -
kubectl get pod calico-node-5d6zb -n kube-system -o yaml | kubectl replace --force -f -
kubectl get pod calico-kube-controllers-56cdb7c587-blc9l -n kube-system -o yaml | kubectl replace --force -f -

3.4 FAQ

calico controller 无法启动,报错信息如下:

client.go 272: Error getting cluster information config ClusterInformation="default" error=Get "https://10.96.0.1:443/apis/crd.projectcalico.org/v1/clusterinformations/default": context deadline exceeded

查看对应 pod 日志发现有一个错误,提示内核版本过低,需要 4.x 版本才行。于是更新内核版本只会就可以了

写本文时安装的是 5.18 版本内核,所有应该不会出现这个问题。

4. 检查集群状态

在 k8s-1 上执行该步骤

检查各组件运行状态

[root@k8s-1 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
controller-manager   Healthy   ok                              
scheduler            Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""} 

查看集群信息

[root@k8s-1 ~]# kubectl cluster-info
Kubernetes control plane is running at https://192.168.2.131:6443
CoreDNS is running at https://192.168.2.131:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

查看节点状态

[root@k8s-1 ~]# kubectl get nodes
NAME    STATUS   ROLES                  AGE   VERSION
k8s-1   Ready    control-plane,master   22m   v1.23.5
k8s-2   Ready    <none>                 21m   v1.23.5
k8s-3   Ready    <none>                 21m   v1.23.5

5. 运行第一个容器实例

在 k8s-1 上执行该步骤

5.1 创建Deployment

nginx-deployment.yaml 文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  # 创建2个nginx容器
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
        ports:
        - containerPort: 80

创建实例

[root@k8s-1 ~]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

查看 pod

$ kubectl get pods

# 输出如下,需要等待一小段时间,STATUS 为 Running 即为运行成功
[root@k8s-1 ~]# kubectl get pods
NAME                               READY   STATUS              RESTARTS   AGE
nginx-deployment-79fccc485-7czxp   0/1     ContainerCreating   0          37s
nginx-deployment-79fccc485-hp565   0/1     ContainerCreating   0          37s

查看 deployment

[root@k8s-1 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           50s

5.2 创建 Service

创建一个 service

[root@k8s-1 ~]# kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer --name=nginx-svc
service/nginx-deployment exposed

也可以通过 配置文件方式创建,nginx-vc.yaml 文件内容如下:

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    name: nginx-svc
spec:
  type: LoadBalancer      
  ports:
  - port: 80         
    targetPort: 80  
    protocol: TCP
  selector:
    app: nginx         
kubectl apply -f nginx-svc.yaml

查看 service

[root@k8s-1 ~]# kubectl get services
NAME               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP      10.96.0.1        <none>        443/TCP        25m
# 由此可见,Nginx 服务已成功发布并将 80 端口映射为 30842
nginx-deployment   LoadBalancer   10.102.137.171   <pending>     80:30842/TCP   40s

查看 service 详情

[root@k8s-1 ~]# kubectl describe service nginx-deployment
Name:                     nginx-deployment
Namespace:                default
Labels:                   app=nginx
Annotations:              <none>
Selector:                 app=nginx
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.102.137.171
IPs:                      10.102.137.171
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30842/TCP
Endpoints:                192.168.13.65:80,192.168.200.193:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

5.3 验证

通过浏览器访问任意服务器

# 端口号为第五步中的端口号
http://192.168.2.131:30842/

此时 Kubernetes 会以负载均衡的方式访问部署的 Nginx 服务,能够正常看到 Nginx 的欢迎页即表示成功。容器实际部署在其它 Node 节点上,通过访问 Node 节点的 IP:Port 也是可以的。

5.4 重置环境

删除 deployment

[root@k8s-1 ~]# kubectl delete deployment nginx-deployment
deployment.apps "nginx-deployment" deleted

删除 services

deployment 移除了 但是 services 中还存在,所以也需要一并删除。

[root@k8s-1 ~]# kubectl delete service nginx-svc
service "nginx-deployment" deleted

至此,实验完成,感谢阅读~


如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注微信公众号。

扫描下方二维码或搜索公众号【探索云原生】即可订阅


k8s切换引擎Containerd 1、为什么弃用docker Kubernetes平台中,为了解决与容器运行时(例如Docker)集成 问题,在早期社区推出了CRI(Container Runtime Interface,容 器运行时接口),以支持更多的容器运行时。 当我们使用Docker作为容器运行时之后,架构是这样的,如图所示: Kubernetes 计划弃用就是kubelet中dockershim。即 Kubernetes kubelet 实现中的组件之一,它能够与 Docker Engine 进行通信 • Doc... 阅读详情

相关推荐

VMware+CentOS部署单机版Kubernetes

目录 1 必备条件 2 为CentOS添加Kubernetes的阿里源 3 CentOS系统配置 4 安装Kubernetes 5 第一次执行初始化 6 获取本机IP地址 7 Kubernetes的配置文件 8 拉取images 9 初始化Kubernetes 10 修改resolv.conf 11 安装网络插件 12 将Master节点设为工作节点 13 安装Dashb...

ganxiaomao的专栏 2631

K8S入门学习笔记第一天,使用kubeadmin部署集群,node节点获取kubectl命名,容器切换为containerd

检测之前的集群环境是否正常 两条命令 1.kubectl get pods -n kube-system #检测k8s组件kube-system命名空间下的pod是否正常 2.kubectl get nodes,pod,svc #检查node,pod,svc是否正常 #发现有一个pod启动不正常 查看日志发现是无法启动识别我的机器网卡,修改calico.yaml重新生成pod kubectl logs -f calico-kube-controllers-69496d8b75-wzlbl -n

weixin_43546282的博客 2066

K8S(Kubernetes)简介和官方安装部署保姆级详细教程

Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。

BlogPan的专栏 4万+

云原生 | k8s的mster-1,一直显示NotReady

mster节点一直显示NotReady 查看kubelet一直报错

m0_70331483的博客 1068

K8s(Kubernetes)搭建从0到1

• Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8s。• Kubernetes用于。官方网站:http://www.kubernetes.io官方文档:https://kubernetes.io/zh/docs/home/

asdmjy123的博客 1909

(k8s)kubernetes集群基于Containerd部署

资源列表基础环境一、基础环境准备1.1、关闭Swap分区1.2、添加hosts解析1.3、桥接的IPv4流量传递给iptables的链二、准备Containerd容器运行时2.1、安装Containerd2.2、配置Containerd2.3、启动Containerd三、部署Kubernetes集群3.1、安装Kubeadm工具3.2、配置crictl工具3.3、配置Containerd镜像加速器3.4、测试crictl工具是否可用3.5、初始化Master节点。

Richardlygo的博客 2149

从零搭建 Kubernetes 单 Master 集群:CentOS 7 + containerd + Flannel 完整实录

本文将在CentOS 7环境中使用containerd、kubeadm、kubelet、kubectl与Flannel搭建Kubernetes集群,并整理Master与Worker节点的自动安装脚本。

羑悻的博客. 3万+

部署k8s基础环境、配置内核模块、基本组件安装

K8S基本概念(功能、架构);部署k8s基础环境;配置内核模块;基本组件安装;

m0_73907608的博客 2731

【k8s】Kubeadm创建Kubernetes集群

使用kubeadm方式手动部署集群超详细教程,包含应用部署示例

weixin_52418790的博客 4169

离线安装4:kubernetes(k8s)离线安装_kubernetes 离线安装

firewall-cmd --zone=public --add-port=10257/tcp --permanent # kube-controller-manager 自身。firewall-cmd --zone=trusted --add-source=192.168.80.60 --permanent # 信任集群中各个节点的IP。firewall-cmd --zone=public --add-port=10259/tcp --permanent # kube-scheduler 自身。

2401_87034001的博客 2758

手把手教你用三菱PLC控制JET伺服原点:从硬件接线到GXWORKS3程序调试

本文详细介绍了如何使用三菱PLC控制JET伺服系统实现原点回归功能,涵盖硬件接线、参数配置到GX Works3程序调试的全流程。通过实战指南,帮助工程师快速掌握伺服控制技术,提升工业自动化项目的实施效率。

weixin_30642561的博客 535

K8S集群搭建——containerd

bridge(桥接) 是 Linux 系统中的一种虚拟网络设备,它充当一个虚拟的交换机,为集群内的容器提供网络通信功能,容器就可以通过这个 bridge 与其他容器或外部网络通信了。

qq_61468858的博客 2461

PTPX功耗分析实战——从脚本配置到报告解读

本文详细介绍了PTPX功耗分析的全流程,从脚本配置到报告解读,帮助工程师快速掌握芯片设计中的功耗估算技术。文章涵盖了环境搭建、波形文件处理、功耗报告解析等关键环节,并提供了实战经验和优化建议,特别适合需要提升PTPX功耗分析效率的开发者。

weixin_29248313的博客 279

kubeadm安装k8s1.28集群

kubeadm安装k8s1.28集群

weixin_44800629的博客 1603

Unity布娃娃系统 Ragdoll Mecanim Mixer使用

6. 选完之后,左键下面的hip等角色各个部位不松开鼠标,拖拽连接到上面Amature的各个部位,如图,下面所有部位都连接完之后,第二步点击Configure Selected Bones确认你的部位连接选择。要做一个布娃娃和动画混合的项目,这个插件是比较不错的,搜了一圈文章教程也是抄来抄去,抄的没有头没有尾,自己摸索着用了一下,记录使用过程吧。8. 之后就点击步骤7图一中的Create Ragdoll,会发现player结构发生变化,如图。4. 添加完脚本之后会显示你的player结构,如图。

SuShengQuanshiW的博客 1650

IPV6基本配置

IPV6配置,DHCPV6,华为模拟器,IPV6的M/O标志位

路漫漫其修远兮 4666

【k8s】利用Kubeadm搭建k8s1.29.x版本+containerd

这里写一个用kubeadm搭建k8s的1.29.x版本,依此来把当前文章变成后续 版本的通用部署k8s文章,容器运行时有好几个 containerd、CRI-O、Docker Engine(使用 cri-dockerd),这里选择containerdcontainerd安装参考手册containerd 调用链更短,组件更少,更稳定,支持OCI标准,占用节点资源更少。建议选择 containerd。以下情况,请选择 docker 作为运行时组件:如需使用 docker in docker。

L李钟意的博客 5854

手把手教你用HI3516CV610搭建智能安防摄像头(附完整开发资料)

本文详细介绍了基于海思HI3516CV610 SOC搭建智能安防摄像头的完整开发流程,包括硬件选型、系统架构设计、开发环境搭建、智能分析功能开发及系统调优。通过实战案例,展示了如何利用内置NPU实现人形检测和异常行为分析,并提供了量产测试方案,帮助开发者快速完成智能摄像头项目。

backprop5master的博客 543

CentOS7使用kubeadm部署k8s-1.28集群

本文记录了在CentOS 7.9环境下部署Kubernetes 1.28集群的过程。采用containerd 1.6.28作为容器运行时,Calico作为网络插件,并搭建NFS共享存储环境。集群包含1个master节点和2个worker节点,均通过kubeadm工具部署。部署步骤包括:系统环境准备(禁用SELinux、swap等)、containerd安装配置、kubeadm/kubelet/kubectl安装,以及cgroup驱动配置。特别针对国内环境配置了镜像源代理,使用阿里云镜像仓库替代默认仓库。

运维攻城狮 3509

电化学-NanoStat-开源系统的使用说明

本文主要介绍了NanoStat开源系统的使用方法,从硬件打板、设备组装、软件安装3个层次进行了详细说明。整个流程根据作者提供的视频能够很好的完成,不需要太多的技术,对刚入门的新手是一个不错的练手项目。其次软件还有很大的优化空间,能够进一步提高系统的精度,对之后类似恒电位仪系统的开发也有很大的借鉴意义。

分享技术笔记,希望对大家能够有一定的帮助,同时也通过归纳总结提升自己的个人能力。 2003

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

864

k8s kubernetes

(Container Runtime Interface): 容器运行时接口,用来运行容器,k8s通过这个接口去兼容不同的容器,目前主要的CRI有CRI-O和containered,dockershim在k8s的1.24版本后从kubelet中剥离出来,主要由docker维护(不是亲儿子k8s也不会管了):containerd由docker开发,是docker用来操作runc的handler,与docker平级,docker生成的images等资源与containerd生成的images等资源不共享。

六月长安的博客 2735

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

kubeadm部署K8S集群并使用containerd做容器运行时

kubeadm部署K8S集群并使用containerd做容器运行时 前言 去年12月份,当Kubernetes社区宣布1.20版本之后会逐步弃用dockershim,当时也有很多自媒体在宣传Kubernetes弃用Docker。其实,我觉得这是一种误导,也许仅仅是为了蹭热度。 dockershim是Kubernetes的一个组件,其作用是为了操作Docker。Docker是在2013年面世的,而Kubernetes是在2016年,所以Docker刚开始并没有想到编排,也不会知道会出现Kubernetes这个

inet_ygssoftware的博客 11万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Kubernetes(k8s) 1.24.0版本基于Containerd的集群安装部署

目录1. containerd安装1. docker安装1.1 卸载旧版本Docker方法1.2 配置yum源1.3 安装docker1.4 配置加速2. 安装cri-dockerd2.1 安装go并设置goproxy2.2 安装cri-dockerd3. 安装k8s集群3.1 服务器要求3.2 基础环境3.3 安装kubelet、kubeadm、kubectl3.4 下载各个机器需要的镜像3.5 初始化主节点(只在master节点执行)3.6 设置.kube/config(只在master执行)3.7 查

Bulut0907 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

《梳理Kubernetes基础环境:通过kubeadm完成集群初始化》

K8s确实不适合只靠背概念入门。Pod、Deployment、Service、Node、Namespace这些词,如果只看定义,很容易越看越抽象。更有效的方式,是先搭出一个能工作的集群,再部署一个最简单的应用,看到它能被访问,后面的理解才会有落点。

月亮永悬不落,剑指巅峰 1万+
上一篇: Kubernetes教程(十一)---使用 KubeClipper 通过一条命令快速创建 k8s 集群
下一篇: Kubernetes教程(二)---集群网络之 Flannel 核心原理
探索云原生
博客等级 码龄9年 730粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值