文章目录
kubernetes 学习
一. kubernetes 安装
目前生产部署
Kubernetes
集群主要有两种方式:
- kubeadm
- 二进制安装
1. kubeadm 安装
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
本次测试只是单纯的搭建
kubernetes
,暂时不做其他容器化操作
1.1 kubeadm 部署方式介绍
kubeadm
是官方社区推出的一个用于快速部署 kubernetes
集群的工具,这个工具能通过两条指令完成一个Kubernetes
集群的部署:
- 创建一个Master节点 kubeadm init
- 将Node节点加入到当前集群中$ kubeadm join <Master 节点的IP和端口>
1.2 服务器及安装环境规划
👉 服务器要求:
- 建议最小硬件配置:2核CPU、2G内存、20G硬盘(安装完成之后查看硬盘使用大概在4~5G)
- 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点
👉 本次测试服务器规划如下:
IP | 节点规划 | 系统版本 |
---|---|---|
192.168.169.150 | master | CentOS Linux release 7.9.2009 (Core) |
192.168.169.151 | node01 | CentOS Linux release 7.9.2009 (Core) |
192.168.169.152 | node02 | CentOS Linux release 7.9.2009 (Core) |
👉 软件版本:
名称 | 版本 |
---|---|
docker | Docker version 20.10.17 |
kubernetes | Kubernetes 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
用的
- 如果说找不到上面的
join
的token
口令,或者说过期了(默认有效期 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
只能集群内部访问,添加Service
为NodePort
类型,暴露到外部,注意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 保持一致 |
template | Pod 模板 |
metadata | Pod 元数据 |
spec | Pod 规格 |
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/