来自:指月 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-1 CentOS 7.9 5.18 2C4G 192.168.2.131 master
k8s-2 CentOS 7.9 5.18 2C4G 192.168.2.132 worker
k8s-3 CentOS 7.9 5.18 2C4G 192.168.2.133 worker

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
EOFsudo 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-utilssudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum 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
EOFcat <<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.gpghttp://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-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:# 修改为主节点IP地址advertiseAddress: 192.168.2.131bindPort: 6443
nodeRegistration:# 修改为 containerdcriSocket: /run/containerd/containerd.sockimagePullPolicy: IfNotPresent# 节点名改成主节点的主机名name: k8s-1taints: 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/16dnsDomain: cluster.localserviceSubnet: 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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, 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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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_TYPEvalue: "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/proxyTo 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-deploymentlabels:app: nginx
spec:# 创建2个nginx容器replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.18.0ports:- 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-svclabels:name: nginx-svc
spec:type: LoadBalancer      ports:- port: 80         targetPort: 80  protocol: TCPselector: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

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

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

  1. 使用Kubeadm创建k8s集群之节点部署(三十二)

    前言 由于上次忘开申明原创,特再发一次. 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜 ...

  2. 使用Kubeadm创建k8s集群之部署规划(三十一)

    前言 上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群. 部署k8s集群存在一定的挑战,尤其是部署高可用的k8s集群更是颇为复杂(后续会讲).因此 ...

  3. kubeadm创建k8s集群(1.14.2版本)

    kubeadm创建k8s集群 1,环境准备 1.1,网络规划 节点名称 IP地址 角色 安装工具 k8s-master-01 172.16.2.101 master kubeadm.kubelet.k ...

  4. 【Kubernetes】如何使用Kubeadm部署K8S集群

    一 . 准备机器 本次环境采用华为云ECS弹性云服务器部署(也可以使用VMware) vm01(2V4G): Ubuntu_18.04作为K8S master节点 vm02(1V1G): Ubuntu ...

  5. Kubernetes教程(十一)---使用 KubeClipper 通过一条命令快速创建 k8s 集群

    来自:指月 https://www.lixueduan.com 原文:https://www.lixueduan.com/posts/kubernetes/11-install-by-kubeclip ...

  6. Kubernetes 系列之 kubeadm 搭建k8s集群

    Kubeadm 搭建k8s集群 注意:Kubernetes 系列 所采用的kuberntetes版本都是 1.15+ 1 Master 节点安装 1.1 系统环境配置 1.1.1 设置主机名称 hos ...

  7. 【Kubernetes 系列】Kubernetes 创建K8s集群项目

    作者:半身风雪 上一节:Kubernetes 概述 创建K8s集群项目 一.创建Minikube 二.创建Deployment 三.创建 Service 四.启用插件 五.删除集群 总结 一.创建Mi ...

  8. kubeadm部署k8s集群最全最详细

    一.安装要求 kubeadm安装kubernetes1.15 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 1.一台或多台机器(≥3奇数个),操作系统 CentOS7.x(最好是 ...

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

    kubeadm部署K8S集群并使用containerd做容器运行时(内容全部实战验证有任何问题欢迎留言咨询讨论) 前言 去年12月份,当Kubernetes社区宣布1.20版本之后会逐步弃用docke ...

最新文章

  1. 一旦一个业务可以由一个人来全部完成而不涉及分工,就会产生单干的情况
  2. 重温c语言之环境变量
  3. 飞秋下载2010正式版最新
  4. html骨架标签 0907
  5. 【笔记】HybridApp中使用Promise化的JS-Bridge
  6. 安卓应用安全指南 5.5.3 处理隐私数据 高级话题
  7. 代码质量度量标准_追求代码质量(2): 监视圈复杂度
  8. php顶级框架,10个顶级PHP开源项目「2019」
  9. maven Could not resolve dependencies
  10. getParameter和getAttribute区别(超详细分析)
  11. 实践项目二:图书馆管理系统 总结
  12. 苹果手机怎么修改dns服务器,苹果手机怎么设置DNS iPhone8更改DNS详细图文教程
  13. Ubuntu12.04解决集成HD3000显卡安装后系统详情显示图形 驱动 未知的方法
  14. 将PDF电子书转换成EPUB格式
  15. 戴尔服务器配置RAID
  16. 无线测量APP开发总结
  17. 戴尔710服务器硬盘灯,DELL R710服务器,做RAID5,更换一个硬盘后硬盘灯,黄灯和绿灯交替不断亮??急急求助...
  18. VB个性签名——在图片上写字
  19. 不同路径中的文件如何批量改名的实用技巧
  20. 乐华阅卷系统打不开服务器,乐华网上阅卷系统1.0操作手册.docx

热门文章

  1. Scrap Shell -笔记
  2. larbin是一种开源的网络爬虫/网络蜘
  3. 电影影院管理系统电影购票系统java项目jsp web项目
  4. War3脚本引擎(Jass)执行函数分析
  5. Windows电脑上最好用的3个azw3阅读器
  6. python自动刷快手视频_快手加抖音自动刷视频脚本,引用的是python+易语言编程...
  7. 一个Vue页面的内存泄露分析
  8. 【C#】使用AutoMapper-看这篇就够了
  9. 百度云智峰会 开放分享 百度云构建全方位技术云生态
  10. 本周AI热点回顾:Github私有库无限协作、飞腾适配百度昆仑AI处理器、OpenAI发布神经网络可视化库