kubernetes 学习

一. kubernetes 安装

目前生产部署 Kubernetes 集群主要有两种方式:

  • kubeadm
  • 二进制安装

1. kubeadm 安装

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

本次测试只是单纯的搭建 kubernetes ,暂时不做其他容器化操作

1.1 kubeadm 部署方式介绍

kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个Kubernetes 集群的部署:

  1. 创建一个Master节点 kubeadm init
  2. 将Node节点加入到当前集群中$ kubeadm join <Master 节点的IP和端口>

1.2 服务器及安装环境规划

👉 服务器要求:

  • 建议最小硬件配置:2核CPU、2G内存、20G硬盘(安装完成之后查看硬盘使用大概在4~5G)
  • 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点

👉 本次测试服务器规划如下:

IP节点规划系统版本
192.168.169.150masterCentOS Linux release 7.9.2009 (Core)
192.168.169.151node01CentOS Linux release 7.9.2009 (Core)
192.168.169.152node02CentOS Linux release 7.9.2009 (Core)

👉 软件版本:

名称版本
dockerDocker version 20.10.17
kubernetesKubernetes v1.23.0

❓ 如何查看版本信息?

  • docker
docker -v
  • kubeadm
kubeadm version
  • kubelet
kubelet --version
  • kubeclt
kubectl version

1.3 初始化服务器配置

💥 初始化服务器配置在所有节点上操作

1️⃣ 关闭防火墙

生产环境看要求

[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
2️⃣ 禁用 selinux
# 直接编辑文件
vim /etc/selinux/config
# 修改 SELINUX 为 disabled
SELINUX=disabled
或者
sed -i 's/enforcing/disabled/' /etc/selinux/config
3️⃣ 关闭 swap 分区

swap 分区的作用是当物理内存不足时,利用 swap 分区做数据交换

在 Kubernetes 1.22 之前,节点不支持使用交换内存,并且默认情况下, 如果在节点上检测到交换内存配置,kubelet 将无法启动。 在 1.22 以后,可以逐个节点地启用交换内存支持。

本次测试选择关闭 swap 分区

详情参考官网:https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/#swap-memory

# 临时关闭,重启服务器后就不生效了
swapoff -a

# 永久关闭
# 直接编辑文件
vim /etc/fstab
# 将 swap 注释,修改完成需要重启
# /dev/mapper/centos-swap swap                    swap    defaults        0 0
或者
sed -i 's/.*swap.*/#&/' /etc/fstab			# 同样需要重启
4️⃣ 设置系统主机名以及 Host 文件的相互解析

生产一般是用自己内部的 DNS 解析

[root@master ~]# hostnamectl set-hostname master01
[root@master ~]# exit
登出
# 登出后在连接,即可看见修改后的主机名,或者执行 bash 命令,也会立即生效
[root@master ~]# bash

cat >> /etc/hosts << EOF
192.168.169.150 maste01
192.168.169.151 node01
192.168.169.152 node02
EOF

在这里插入图片描述

5️⃣ 将桥接的 IPv4 流量传递到 iptables 的链

有一些 ipv4 的流量不能走 iptables 链 (linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理),导致流量丢失。(这个内核详细的我也不懂 😿 )

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 使配置生效
sysctl --system

# 查看是否加载成功
lsmod | grep br_netfilter

在这里插入图片描述

6️⃣ 时间同步

因为 k8s 的证书对于时间同步要求比较严格,所以这里需要配置一个时间同步的操作

# 使用 centos 自带的 chronyd(这个相对方便一点)
systemctl  start  chronyd.service
systemctl  enable  chronyd.service

或者

yum install ntpdate -y
ntpdate time.windows.com
# 注意:虚拟机不管关机还是挂起,每次重新操作都需要更新时间进行同步。好像也需要配置定时同步 crontab
7️⃣ 安装 Docker
安装 docker

本次测试默认安装最新版本,如果需要自定义安装版本,

可参考:https://blog.csdn.net/D1179869625/article/details/122909512

# 下载阿里的 yum 源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 使用 yum 安装 docker
yum -y install docker-ce

# 启动 docker 并设置开机自启
systemctl start docker
systemctl enable docker

在这里插入图片描述

配置 docker 镜像加速器

登陆自己的阿里云搜索 ”容器镜像服务“

在这里插入图片描述

在这里插入图片描述

# 创建之前可以检查一下是否存在,在启动 docker 之后就会创建这个文件,但是阿里的这个配置文件是不全面的,需要添加另外一个配置,参考下面的全面配置
sudo mkdir -p /etc/docker	

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://2oka4vlk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

注意:这里配置阿里云加速时一定要加上下面一段,不然在 kubeadm init 的时候会报错

 "exec-opts": [
    "native.cgroupdriver=systemd"
  ],

daemon.json整体配置如下:

tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://2oka4vlk.mirror.aliyuncs.com"]
}
EOF

在这里插入图片描述

# 重启 docker
systemctl restart docker

# 查看 docker 安装信息
docker info
8️⃣ 安装 kubeadm、kubelet、kubectl
配置阿里云的 yum 源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
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
EOF

在这里插入图片描述

安装 kubeadm、kubelet、kubectl
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

# 注意,这里安装之后不需要启动,只需要设置开机自启即可
systemctl enable kubelet

在这里插入图片描述

1.4 部署 kubernetes

注意:没有特殊说明的都是在 master 上进行操作

1️⃣ kubeadm 部署

这里执行 kubeadm init 会比较慢,要等一会

kubeadm init \
  --apiserver-advertise-address=192.168.169.150 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all
  
参数解析说明:
	--apiserver-advertise-address 集群通告地址
	--image-repository	由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
	--kubernetes-version K8s版本,与上面安装的一致
	--service-cidr 集群内部虚拟网络,Pod统一访问入口
	--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

注意:如果在执行 kubeadm init 失败后,可以使用 kubeadm reset 清除之前初始化环境信息,再重新执行 kubeadm init

  • 初始化完成之后会有一个 kubeadm join 的口令,是让 node 节点加入到 master 用的

在这里插入图片描述

  • 如果说找不到上面的 jointoken 口令,或者说过期了(默认有效期 24 小时),可以使用下面的命令生成
 kubeadm token create --print-join-command
2️⃣ 将从节点加入到 master(在从节点执行)

在从节点执行 master 中生成的 token 口令

kubeadm join 192.168.169.150:6443 --token kqz2y5.rquvsfoctr5pqqvk \
	--discovery-token-ca-cert-hash sha256:a679ff960780720182d15f4c5659c1489f1067551a6de4bb688e10dc967965c0

在这里插入图片描述

  • 删除一个节点(在 master 上操作)
# 查看所有节点信息
[root@master01 ~]# kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
master01   Ready    control-plane,master   27h   v1.23.0
node01     Ready    <none>                 27h   v1.23.0
node02     Ready    <none>                 27h   v1.23.0

# 删除节点 node01
[root@master01 ~]# kubectl delete node node01
node "node01" deleted

# 再次查看节点信息
[root@master01 ~]# kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
master01   Ready    control-plane,master   27h   v1.23.0
node02     Ready    <none>                 27h   v1.23.0
  • 将节点重新加入到集群中(在从节点上执行操作)
# 在 node 节点上重置一下
kubeadm reset

# 然后在 master 节点上执行获取 token
kubeadm token create --print-join-command

# 在 node 节点上执行
kubeadm join 192.168.169.150:6443 --token i6rwyb.i2ijphzdb4cpbi5q --discovery-token-ca-cert-hash sha256:a679ff960780720182d15f4c5659c1489f1067551a6de4bb688e10dc967965c0

执行完以上操作即可将删除的节点再次加入到集群中
  • 查看节点详细信息
# 语法
kubectl describe nodes <name>

# 示例:
[root@master01 ~]# kubectl describe nodes node01
Name:               node01
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=node01
                    kubernetes.io/os=linux
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    projectcalico.org/IPv4Address: 192.168.169.151/24
                    projectcalico.org/IPv4IPIPTunnelAddr: 10.244.196.128
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Sat, 02 Jul 2022 21:07:57 +0800

. . . . . . . . . . . . . . 

3️⃣ 拷贝k8s认证文件

参考官网:官网地址

官网中有对 TLS 证书错误 做解答

在这里插入图片描述

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

# 查看节点信息,如果没有拷贝认证文件,是看不到节点信息的
kubectl get nodes

在这里插入图片描述

由于没有配置网络插件,所以这里看到节点信息都是 NotReady (未就绪)的

4️⃣ 配置容器网络

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

  • 下载 YAML 文件
 wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
  • 修改 calico.yaml 文件配置

修改里面定义 Pod 网络(CALICO_IPV4POOL_CIDR),与前面 kubeadm init--pod-network-cidr 指定的一样,这里修改为 10.244.0.0/16

注意:这里默认是注释的,在配置的时候要注意缩进,yaml 文件对于缩进要求比较严苛

在这里插入图片描述

  • 修改完成就可以部署了
# 执行命令之后需要等一会进行操作,需要等到全部状态为 running 时
kubectl apply -f calico.yaml

# 使用如下命令查看全部命名空间下的运行情况(官方推荐使用)
kubectl get pods --all-namespaces

# 也可以使用如下命令查看 kube-system 命名空间下的运行情况
kubectl get pods -n kube-system

在这里插入图片描述

等 STATUS 状态全部为 Running 时,节点状态就会改变

在这里插入图片描述

在这里插入图片描述

5️⃣ 查看节点详细信息

详情参考官网:官网地址

  • 语法
kubectl describe node <节点名称>
  • 示例
kubectl describe node node01

1.5 部署 Dashboard

Dashboard 是官方提供的一个 UI,可用于基本管理 K8s 资源

1️⃣ 下载 YAML 文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
2️⃣ 修改配置文件

默认 Dashboard 只能集群内部访问,添加 ServiceNodePort 类型,暴露到外部,注意 yaml缩进

这里增加了如下两个参数:

nodePort: 30001 默认值:30000-32767,如果不配置这个参数,它就会自动随机生成一个端口

type: NodePort 配置为NodePort,外部可以访问

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort

在这里插入图片描述

3️⃣ 部署 Dashboard
kubectl apply -f recommended.yaml

在这里插入图片描述

4️⃣ 查看状态及端口
[root@master01 ~]# kubectl get pods,svc -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS        AGE
pod/dashboard-metrics-scraper-799d786dbf-x7xxx   1/1     Running   1 (4h36m ago)   4h57m
pod/kubernetes-dashboard-6b6b86c4c5-67cp5        1/1     Running   1 (4h36m ago)   4h57m

NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
service/dashboard-metrics-scraper   ClusterIP   10.106.114.201   <none>        8000/TCP        4h57m
service/kubernetes-dashboard        NodePort    10.97.128.83     <none>        443:30001/TCP   4h57m


参数解析:
svc			命名空间(可以看到 service 暴露的端口,对内是 443,对外是前面在文件中配置的 30001,如果不指定端口,那么这里将随机生成一个对外暴露的端口)
6️⃣ 访问测试

浏览器输入:https://masterip:30001

这里是:https://192.168.169.150:30001/

注意:要是 https 如果是 http 它会给你一个提示 Client sent an HTTP request to an HTTPS server

关机之后第二天登陆的时候发现 Google Chrome 连接不了,查看状态也是正常的。然后换个浏览器就好了,不知道为什么。

在这里插入图片描述

7️⃣ 创建service account并绑定默认cluster-admin管理员集群角色

可参考:https://blog.csdn.net/weixin_55609944/article/details/119763303

 # 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system

# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

# 获取令牌秘钥
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

具体参数解析后期再加上

在这里插入图片描述

  • 将上面生成的 token 填写到登陆页面中
eyJhbGciOiJSUzI1NiIsImtpZCI6Im9LTlE3LTV5eHVTNjZqdDJZeGxzOGNWUFozR1RiQVVzeXZHNXIxNWZIalUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tOXM4amciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOGU2OWY3Y2YtNTgzZC00OTgwLTgxN2YtYWU4ZGVkNmEyODhjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.thyMQGCmugnXJkX9FLvAxA43G0yThMRwbtMTRWBhUhB53_lPyx53P9zkUc4MLPtDu1WQNlAHpg8iT2wl2h4_hTDPUPovxItWvqPS8YowVoexZuy6ejXhUHPftxBo5UAc5aRwbfJtzW_QMbOfeNDcLvqvguCcNslYZyfEuTtgSAylt8UbCx27RQ3QWB3y37NeHoA4RicP3mG3CSnmMcRiq4HVVb1NuWHsgcqtEL10EI21Rq6_NPGl1IFoGGV1MzUvtyJdXMmFuBoGCUvLx1Xj8b6d0vn2YnttqdH8kzMfUzYzPgYmyOfNXIYbLU7LZ6Q-C6CqyFlSjcMxeo06QNn5Wg

在这里插入图片描述

1.6 总结

使用 kubeadm 搭建 kubernetes 就到这里了,这里就只是简单的安装操作。

参考文档:博客传送门

视屏参考:B站传送门

1.7 问题

官方总结的问题参考:官网地址

以下是个人在安装时遇到的问题,基本都是不细心造成的问题。

1️⃣ 问题一

❓ 如果遇到如下报错

[root@master01 ~]# kubeadm init \
>   --image-repository registry.aliyuncs.com/google_containers \
>   --kubernetes-version v1.23.0 \
>   --service-cidr=10.96.0.0/12 \
>   --pod-network-cidr=10.244.0.0/16 \
>   --ignore-preflight-errors=all
[init] Using Kubernetes version: v1.23.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.169.150]
[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.169.150 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.169.150 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.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.

	Unfortunately, an error has occurred:
		timed out waiting for the condition

	This error is likely caused by:
		- The kubelet is not running
		- The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

	If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
		- 'systemctl status kubelet'
		- 'journalctl -xeu kubelet'

	Additionally, a control plane component may have crashed or exited when started by the container runtime.
	To troubleshoot, list all containers using your preferred container runtimes CLI.

	Here is one example how you may list all Kubernetes containers running in docker:
		- 'docker ps -a | grep kube | grep -v pause'
		Once you have found the failing container, you can inspect its logs with:
		- 'docker logs CONTAINERID'

error execution phase wait-control-plane: couldn't initialize a Kubernetes cluster
To see the stack trace of this error execute with --v=5 or higher
[root@master01 ~]#  

这里在执行 kubeadm init 时报错,就是因为在配置 docker 文件时出错了。参考 [配置 docker 镜像加速器](# 配置 docker 镜像加速器)

可参考:https://blog.csdn.net/qq_33326449/article/details/119699126

2️⃣ 问题二

❓ 如果遇到下面报错

详细说明:

在访问 Dashboard 时,页面提示如下内容,则是因为访问是没有使用 https

可参考:https://blog.csdn.net/HYZX_9987/article/details/119575710

Client sent an HTTP request to an HTTPS server

2. 二进制安装 kubernetes

暂时没写

3. 简单创建一个 nginx

  • 简单部署流程

在这里插入图片描述

  • 个人理解简单的一个访问流程

在这里插入图片描述

  • Pod

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一 个进程。

  • Deployment

Deployment是k8s中用来管理发布的控制器,用于更高级别的部署和管理 pod

  • Service

为一组 pod 提供负载均衡,对外提供统一的访问入库

  • Label

标签,Label其实就一对 key/value ,用于关联到对象、查询和筛选

3.1 使用命令行部署一个应用程序

👉 用 deployment 控制器部署镜像

  • 创建一个 namespace
# 语法
kubectl create namespace <name>

# 示例
[root@master01 ~]# kubectl create namespace demo-wep

# 查看 namespace
[root@master01 ~]# kubectl get namespaces
NAME                   STATUS   AGE
default                Active   30h
demo-web               Active   30m
kube-node-lease        Active   30h
kube-public            Active   30h
kube-system            Active   30h
kubernetes-dashboard   Active   29h
  • 使用 deployment 部署一个 nginx 服务

详情查看官网:官网传送门

# 使用 deployment 控制器部署镜像
[root@master01 ~]# kubectl create deployment nginx-demo --image=nginx --replicas=3 -n demo-web
deployment.apps/nginx-demo created

参数解析:
	kubectl create deployment				使用 deployment 方式创建 pod 管理器的方式创建 pod
	web					自定义的服务名称,一般要求具有唯一性
	--image=nginx		镜像
    --replicas=3		副本数(或者称为实例数)
    -n demo-wep			指定命名空间(如果不指定,则默认为 default)

  • 查看生成的 pod 实例
# 查看生成的 pod 实例(创建的时候指定了命名空间,那么在查询的时候也需要指定命名空间)
[root@master01 ~]# kubectl get pods -n demo-web
NAME                          READY   STATUS              RESTARTS   AGE
nginx-demo-5dfc44fcdb-26ncr   0/1     ContainerCreating   0          53s
nginx-demo-5dfc44fcdb-4ftcv   1/1     Running             0          53s
nginx-demo-5dfc44fcdb-hnvnk   1/1     Running             0          53s
  • 删除一个 pod 实例
# 删除一个 pod
kubectl delete pod <NAME> [namespace]
# 示例:
[root@master01 ~]# kubectl delete pod nginx-demo-5dfc44fcdb-26ncr -n demo-web
pod "nginx-demo-5dfc44fcdb-26ncr" deleted
  • 查看创建的 deployment
# 查看创建的 deployment
[root@master01 ~]# kubectl get deployment -n demo-web
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-demo   3/3     3            3           3m1s
  • 查看 deployments 部署详细信息
[root@master01 ~]#  kubectl describe deployments -n demo-web

Name:                   nginx-demo
Namespace:              demo-web
CreationTimestamp:      Sun, 03 Jul 2022 00:48:52 +0800
Labels:                 app=nginx-demo
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx-demo
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx-demo
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-demo-5dfc44fcdb (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  5m17s  deployment-controller  Scaled up replica set nginx-demo-5dfc44fcdb to 3
  • 删除一个 deployment
# 删除一个 deployment
[root@master01 ~]# kubectl delete deployment web
deployment.apps "web" deleted

3.2 用 YAML 文件创建部署

可以直接在 kubernetes 官网搜索相关文档

参考地址:https://kubernetes.io/zh-cn/docs/home/

在这里插入图片描述

一般前几个就可以满足我们的参考需求

在这里插入图片描述

在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx2
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

上面这个 YAML 文件就等同于 kubectl create deployment nginx-deployment-image=nginx --replicas=3

参数说明:

详情参考官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/#creating-a-deployment

参数含义
apiVersion创建该对象所使用的 Kubernetes API 的版本
kind想要创建的对象的类别
metadata帮助唯一性标识对象的一些数据,包括一个 name 字符串、UID 和可选的 namespace
spec资源规格
replicas副本(实例)数量
selector标签选择器,与下面的 metadata.labels 保持一致
templatePod 模板
metadataPod 元数据
specPod 规格
containers容器配置
  • apiVersion: apps/v1

这个版本号是会发生变化的,我们可以通过官方文档查看最新版本信息,也可以通过如下命令获取

[root@master01 ~]# kubectl api-resources | grep deployment
deployments                       deploy       apps/v1                                true         Deployment
  • 执行 YAML 文件
[root@master01 ~]# kubectl apply -f nginx.yaml 
deployment.apps/nginx-deployment created
[root@master01 ~]# kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-57774bb9bf-kb8ls   0/1     ContainerCreating   0          10s
nginx-deployment-57774bb9bf-tgfh2   0/1     ContainerCreating   0          10s
nginx-deployment-57774bb9bf-vzrrf   0/1     ContainerCreating   0          10s
[root@master01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           57s

3.3 使用 service 将 pod 暴露出去

1️⃣ 使用命令行将 pod 端口暴露出去
# 使用 service 将 pod 暴露出去
[root@master01 ~]# kubectl expose deployment nginx-demo --port=80 --target-port=80 --type=NodePort -n demo-web
service/nginx-demo exposed

[root@master01 ~]# kubectl get service -n demo-web
NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-demo   NodePort   10.110.255.35   <none>        80:32011/TCP   62s		# 这里的 32011 就是对外访问的端口

2️⃣ 使用 YAML 文件将 pod 端口暴露出去

官网地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/

在这里插入图片描述

在这里插入图片描述

apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment
spec:
  selector:
    app: nginx2
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

以上 YAML 文件内容就等同于 kubectl expose deployment nginx-demo --port=80 --target-port=80 --type=NodePort

YAML 文件参数解析:

name: nginx-deployment 这里的 name 要与上面创建时的 YAML 文件中的 metadata.name: nginx-deployment 保持一致

app: nginx2 这里则需要和上面创建时的 YAML 文件中的 labels.app: nginx2 保持一致

targetPort: 80 修改内部访问的端口(暂时没用到,后期在具体写)

type: NodePort 增加一个对外暴露的端口类型

  • 执行 service YAML 文件
[root@master01 ~]# kubectl apply -f nginx-service.yaml 
service/nginx-deployment created
[root@master01 ~]# kubectl get service
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP        42h
nginx-deployment   NodePort    10.107.39.60   <none>        80:32430/TCP   10s
web                NodePort    10.98.186.66   <none>        80:31431/TCP   18h

在这里插入图片描述

  • 查看 service 关联的 pod 信息
# 查看所有的 pod 和 service(注意:我这里 service/web 因为是配置了命名空间,所以这里不加命名空间则查看不到)
[root@master01 ~]# kubectl get pods,service
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-57774bb9bf-kb8ls   1/1     Running   0          18m
pod/nginx-deployment-57774bb9bf-tgfh2   1/1     Running   0          18m
pod/nginx-deployment-57774bb9bf-vzrrf   1/1     Running   0          18m

NAME                       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP        43h
service/nginx-deployment   NodePort    10.107.39.60   <none>        80:32430/TCP   4m37s
service/web                NodePort    10.98.186.66   <none>        80:31431/TCP   18h

# 这里就是查看指定命名空间中的 service 和 pod
[root@master01 ~]# kubectl get pods,service -n demo-web
NAME                              READY   STATUS    RESTARTS   AGE
pod/nginx-demo-5dfc44fcdb-4ftcv   1/1     Running   0          11h
pod/nginx-demo-5dfc44fcdb-65hdg   1/1     Running   0          11h
pod/nginx-demo-5dfc44fcdb-6xjhm   1/1     Running   0          39m

NAME                 TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/nginx-demo   NodePort   10.110.255.35   <none>        80:32011/TCP   11h

# 查看 service 具体对应的 pod ip
[root@master01 ~]# kubectl get endpoints
NAME               ENDPOINTS                                             AGE
kubernetes         192.168.169.150:6443                                  43h
nginx-deployment   10.244.140.80:80,10.244.140.81:80,10.244.196.137:80   5m39s
web                <none>                                                18h

# 查看指定命名空间中的 service 具体对应的 pod ip
[root@master01 ~]# kubectl get endpoints -n demo-web
NAME         ENDPOINTS                                               AGE
nginx-demo   10.244.196.129:80,10.244.196.131:80,10.244.196.135:80   11h

3.4 访问测试

可以使用浏览器访问上面创建的 nginx 服务,而且这里使用集群中的其他的 ip 地址也可以访问

http://192.168.169.150:32011/
http://192.168.169.151:32011/
http://192.168.169.152:32011/

在这里插入图片描述

 
 
 
 
 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐