centos7安装k8s1.23.6
一、准备步骤:步骤1.关闭三台设备selinux和设置防火墙selinux需要将修改/etc/selinux/config文件,将SELINUX设置为disable;# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:#enforcing - SE
零、前言
本次安装是本人第一次安装成功,之前在垃圾堆里面刨食,在网上找的安装文档从来没成功过。
主要是靠以下这个视频,和视频中提供的资料。建议结合视频和本文进行操作。https://www.bilibili.com/video/BV1MT411x7GH?p=23&vd_source=ecc9d73a893f88f223a0373d80e35c00
一、软件环境
操作系统centos7
docker:20+ 这里用的26.1.4
k8s:1.23.6
二、初始化操作(所有节点)
#yum换源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum makecache # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 setenforce 0 # 临时 # 关闭swap swapoff -a # 临时 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久 # 关闭完swap后,一定要重启一下虚拟机!!! # 根据规划设置主机名 hostnamectl set-hostname <hostname> # 在master添加hosts cat >> /etc/hosts << EOF 192.168.50.76 k8s-master 192.168.50.77 k8s-node1 192.168.50.78 k8s-node2 EOF # 将桥接的IPv4流量传递到iptables的链 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system # 生效 # 时间同步 yum install ntpdate -y ntpdate time.windows.com
三、安装基础软件(所有节点)
1.安装docker
Docker CE 是免费的 Docker 产品的新名称,Docker CE 包含了完整的 Docker 平台,非常适合开发人员和运维团队构建容器 APP。
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# PS:如果出现如下错误信息
Loaded plugins: fastestmirror
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
Could not fetch/save url https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to file /etc/yum.repos.d/docker-ce.repo: [Errno 14] curl#60 - "Peer's Certificate issuer is not recognized."
# 编辑 /etc/yum.conf 文件, 在 [main] 下面添加 sslverify=0 参数
vi /etc/yum.conf
# 配置如下----------------------
[main]
sslverify=0
# -----------------------------
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce-26.1.4
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
安装校验
docker version
docker换源
vi /etc/docker/daemon.json
{
"registry-mirrors" : [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com/"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启 docker
systemctl daemon-reload
systemctl restart docker
2.添加阿里云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
3.安装kubeadm、kubelet、kubectl
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet
# 配置关闭 Docker 的 cgroups,修改 /etc/docker/daemon.json,加入以下内容
"exec-opts": ["native.cgroupdriver=systemd"]
# 重启 docker
systemctl daemon-reload
systemctl restart docker
四、部署k8s master(仅在master节点执行)
# 在 Master 节点下执行
kubeadm init \
--apiserver-advertise-address=192.168.50.76 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 安装成功后,复制如下配置并执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
五、加入k8s node (仅在非master节点执行)
分别在 k8s-node1 和 k8s-node2 执行
# 下方命令可以在 k8s master 控制台初始化成功后复制 join 命令
kubeadm join 192.168.50.76:6443 --token ajpnke.g6163rce3m7krwqg --discovery-token-ca-cert-hash sha256:a2101c1e0183fecb861235ac8cfc6ee34ef8e0d5942876dc3ba29a5d8d6c55fb
# 如果初始化的 token 不小心清空了,可以通过如下命令获取或者重新申请
# 如果 token 已经过期,就重新申请
kubeadm token create
# token 没有过期可以通过如下命令获取
kubeadm token list
# 获取 --discovery-token-ca-cert-hash 值,得到值后需要在前面拼接上 sha256:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
六、部署CNI网络插件
# 在 master 节点上执行
# 下载 calico 配置文件,可能会网络超时
mkdir /opt/k8s
cd /opt/k8s
curl https://docs.projectcalico.org/manifests/calico.yaml -O
# 修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同,即为10.244.0.0/16
# 修改 IP_AUTODETECTION_METHOD 下的网卡名称。没找到,没改。
# 删除镜像 docker.io/ 前缀,避免下载过慢导致失败
sed -i 's#docker.io/##g' calico.yaml
#执行部署命令
kubectl apply -f calico.yaml
执行之后,看pod都启动起来没
kubectl get po -n kube-system
最开红框里面的Pod全都没好,而且status是Init:ImagePullBackOff
好,这个时候就要去看这个pod的日志,执行以下命令:
kubectl describe pod calico-node-hh975 -n kube-system
执行了以后从最后一行能看到他们一直在pull镜像,我已经调好了,先没截图,以下给个网上找的别人的图片
实际上几个启动不起来的pod他们的原因就是一直在pull calico/cni和calico/node和calico/kube-controllers这三个镜像。
解决办法:
在每台机器(注意,不光是master,pod会被分发到其他node节点)手动执行docker pull
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0 calico/node:v3.25.0
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0 calico/kube-controllers:v3.25.0
docker pull docker.m.daocloud.io/calico/cni:v3.25.0
docker tag docker.m.daocloud.io/calico/cni:v3.25.0 calico/cni:v3.25.0
然后docker images 确认有了这些镜像。
删除因为PullImageBackOff失败的pod,这样他们会自动重启。
kubectl delete pod calico-node-hh975 -n kube-system
过两分钟再看
七、(到这里安装k8s就完了)测试k8s集群
# 在master节点创建部署
kubectl create deployment nginx --image=nginx:v1.27.0
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看 pod 以及服务信息
kubectl get pod,svc
请求 curl 192.168.50.76:31265
八、可视化之----k8s dashboard安装
cd /opt/k8s
1.安装
# 下载官方部署配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 修改属性
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #新增 只有这句要改,其他都不用
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
安装命令
kubectl apply -f recommended.yaml
查看
kubectl get po -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard
浏览器访问
2.配置所有权限账号
# 创建账号配置文件
touch dashboard-admin.yaml
# 配置文件
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin-cluster-role
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
# 创建资源
kubectl apply -f dashboard-admin.yaml
#查看
kubectl get sa -n kubernetes-dashboard
# 查看账号信息
kubectl describe serviceaccount dashboard-admin -n kubernetes-dashboard
# 获取账号的 token 登录 dashboard
kubectl describe secrets dashboard-admin-token-knqdc -n kubernetes-dashboard
复制这个token到dashboard登录界面
eyJhbGciOiJSUzI1NiIsImtpZCI6ImF4VC11MHVVYV9kSWFXbk5iWnkyT0xzNFhjNENrak1kUGdKeHdNTDdRbEkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4ta25xZGMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYjNkZDZjNjktMDFlNS00Y2UwLWE2YWItNDRlNTMyMmMyYzhlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.V_NnmIQxQeiQ3ocyGxAGWTcWyQN7DsDMMOFvcu5hoeeaL6ICTNWzJ2k0_gkh1Y-e-xW7EL2zQEDCD9_fWCPdXXI4fRlpCFPp48fGM9LqxknXSEoM6cR4AyLPJGun77jJPLhtyHNvKWzDWrioz94wO382i6O1MTOX2O8_UPcBhWmld-_2gqwSL7WR67dyfGAm5TkDVZ_yXndDZ8Hq2oem-q7Q7C2fNUbojD4WJ0BqyQobqQiVg6GcCwsFVTi3qBY8585gQ2742b6fJ6Ftqe_ZGgJz4BZtz1nslyFu-lBQlqpLm_sasAbVaQbS1hDRVAChriJgLxyF5iO308POacCsMw
点击登录
九、安装nfs及storageclass动态制备
# 安装 nfs 每台
yum install nfs-utils -y
# 启动 nfs 每台
systemctl start nfs-server
systemctl enable nfs-server
# 查看 nfs 版本
cat /proc/fs/nfsd/versions
# node1 创建共享目录
mkdir -p /data/nfs
cd /data/nfs
mkdir rw
mkdir ro
# node1 设置共享目录 export
vim /etc/exports
/data/nfs/rw 192.168.50.0/24(rw,sync,no_subtree_check,no_root_squash)
/data/nfs/ro 192.168.50.0/24(ro,sync,no_subtree_check,no_root_squash)
# node1 重新加载
exportfs -f
systemctl reload nfs-server
# 到其他测试节点安装 nfs-utils 并加载测试
mkdir -p /mnt/nfs/rw
mount -t nfs 192.168.50.77:/data/nfs/rw /mnt/nfs/rw
mkdir -p /mnt/nfs/ro
mount -t nfs 192.168.50.77:/data/nfs/rw /mnt/nfs/ro
安装制备器相关
kubectl apply -f nfs-provisioner-rbac.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: kube-system
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: kube-system
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
kubectl apply -f nfs-provisioner-deployment.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
namespace: kube-system
---
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: kube-system
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
# image: quay.io/external_storage/nfs-client-provisioner:latest
image: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.50.77
- name: NFS_PATH
value: /data/nfs/rw
volumes:
- name: nfs-client-root
nfs:
server: 192.168.50.77
path: /data/nfs/rw
kubectl apply -f nfs-storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs
parameters:
archiveOnDelete: "false"
查看nfs-client制备器是否启动
[root@k8s-master volumes]# kubectl get po -n kube-system | grep nfs
nfs-client-provisioner-5fd64996b7-67h74 1/1 Running 0 6m13s
查看是否有了这个sc
[root@k8s-master volumes]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage fuseim.pri/ifs Delete Immediate false 6m31s
标记它为默认的sc
kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
十、可视化之----kubesphere部署
1.本地存储动态PVC(不想用这个,用的前面那个nfs)
# 在所有节点安装 iSCSI 协议客户端(OpenEBS 需要该协议提供存储支持)
yum install iscsi-initiator-utils -y
# 设置开机启动
systemctl enable --now iscsid
# 启动服务
systemctl start iscsid
# 查看服务状态
systemctl status iscsid
# 安装 OpenEBS
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
# 查看状态(下载镜像可能需要一些时间)
kubectl get all -n openebs
# 在主节点创建本地 storage class
vi default-storage-class.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local
annotations:
cas.openebs.io/config: |
- name: StorageType
value: "hostpath"
- name: BasePath
value: "/var/openebs/local/"
kubectl.kubernetes.io/last-applied-configuration: >
{"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"cas.openebs.io/config":"-
name: StorageType\n value: \"hostpath\"\n- name: BasePath\n value:
\"/var/openebs/local/\"\n","openebs.io/cas-type":"local","storageclass.beta.kubernetes.io/is-default-class":"true","storageclass.kubesphere.io/supported-access-modes":"[\"ReadWriteOnce\"]"},"name":"local"},"provisioner":"openebs.io/local","reclaimPolicy":"Delete","volumeBindingMode":"WaitForFirstConsumer"}
openebs.io/cas-type: local
storageclass.beta.kubernetes.io/is-default-class: 'true'
storageclass.kubesphere.io/supported-access-modes: '["ReadWriteOnce"]'
provisioner: openebs.io/local
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
运行安装
kubectl apply -f default-storage-class.yaml
查看sc
kubectl get sc
2.安装
# 安装资源
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/cluster-configuration.yaml
#查看是否运行
kubectl get po -n kubesphere-system
# 检查安装日志
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
日志显示以下内容表示安装好了
# 查看端口
kubectl get svc/ks-console -n kubesphere-system
# 默认端口是 30880,如果是云服务商,或开启了防火墙,记得要开放该端口
# 登录控制台访问http://192.168.50.76:30880,账号密码:admin/P@88w0rd
3.启动可插拔组件
https://kubesphere.io/zh/docs/v3.3/pluggable-components/
4.直接在kubesphere界面开启devops组件(可选)
在定制资源定义中搜索clusterconfiguration,
把devops中是否开启改为true,点击确认
5.prometheus访问
官方的cluster-configuration.yaml里面是一起给我们安装了监控组件的,但是prometheus的访问界面是ClusterIp,我懒得做ingress了,直接改成NodePort就能看了
kubectl edit svc -n kubesphere-monitoring-system prometheus-k8s
把clusterip改为NodePort
验证
kubectl get svc -n kubesphere-monitoring-system
访问 192.168.50.76:31156
十一、ingress-nginx
1.安装helm
下载 wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
解压 tar -zxvf helm-v3.2.3-linux-amd64.tar.gz
拷贝 cp helm /usr/local/bin
helm version 看是否安装好
2.安装ingress-nginx
参考官网
https://kubernetes.github.io/ingress-nginx/deploy/#using-helm
# 添加仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# 查看仓库列表
helm repo list
# 搜索 ingress-nginx
helm search repo ingress-nginx
# 下载安装包
helm pull ingress-nginx/ingress-nginx
# 将下载好的安装包解压
tar xf ingress-nginx-4.11.2.tgz
# 解压后,进入解压完成的目录
cd ingress-nginx
# 修改 vi values.yaml
镜像地址:修改为国内镜像
registry: registry.cn-hangzhou.aliyuncs.com
image: google_containers/nginx-ingress-controller
image: google_containers/kube-webhook-certgen
tag: v1.3.0或者跟上面那个一样1.11.2
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
修改部署配置的 kind: DaemonSet
nodeSelector:
ingress: "true" # 增加选择器,如果 node 上有 ingress=true 就部署
将 admissionWebhooks.enabled 修改为 false
将 service 中的 type 由 LoadBalancer 修改为 ClusterIP,如果服务器是云平台才用 LoadBalancer
# 为 ingress 专门创建一个 namespace
kubectl create ns ingress-nginx
# 为需要部署 ingress 的节点上加标签
kubectl label node k8s-node1 ingress=true
# 安装 ingress-nginx
helm install ingress-nginx ./ingress-nginx -n ingress-nginx .
2.使用
创建用于测试的deployment
kubectl create -f nginx-deploy.yaml --record
--record 会在 annotation 中记录当前命令创建或升级了资源,后续可以查看做过哪些变动操作。
apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为 deployment
metadata: # 元信息
labels: # 标签
app: nginx-deploy # 具体的 key: value 配置形式
name: nginx-deploy # deployment 的名字
namespace: default # 所在的命名空间
spec:
replicas: 1 # 期望副本数
revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数
selector: # 选择器,用于找到匹配的 RS
matchLabels: # 按照标签匹配
app: nginx-deploy # 匹配的标签key/value
strategy: # 更新策略
rollingUpdate: # 滚动更新配置
maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例
maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功
type: RollingUpdate # 更新类型,采用滚动更新
template: # pod 模板
metadata: # pod 的元信息
labels: # pod 的标签
app: nginx-deploy
spec: # pod 期望信息
containers: # pod 的容器
- image: nginx:1.7.9 # 镜像
imagePullPolicy: IfNotPresent # 拉取策略
name: nginx # 容器名称
resources:
limits:
cpu: 200m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
restartPolicy: Always # 重启策略
terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间
查看部署信息
kubectl get deployments
查看 rs
kubectl get rs
查看 pod 以及展示标签,可以看到是关联的那个 rs
kubectl get pods --show-labels
哦豁,我该创建2个副本的,yaml里面只写了1个。执行以下命令加一个
kubectl scale deployment nginx-deploy --replicas=2
创建用于测试的service(nodeport)
kubectl create -f nginx-svc.yaml
apiVersion: v1
kind: Service # 资源类型为 Service
metadata:
name: nginx-svc # Service 名字
labels:
app: nginx # Service 自己本身的标签
spec:
selector: # 匹配哪些 pod 会被该 service 代理
app: nginx-deploy # 所有匹配到这些标签的 pod 都可以通过该 service 进行访问
ports: # 端口映射
- port: 80 # service 自己的端口,在使用内网 ip 访问时使用
targetPort: 80 # 目标 pod 的端口
nodePort: 32000 # 固定绑定到所有 node 的 32000 端口上
name: web # 为端口起个名字
type: NodePort # 随机启动一个端口(30000~32767),映射到 ports 中的端口,该端口是直接绑定在 node 上的,且集群中的每一个 node 都会绑定这个端口
# 也可以用于将服务暴露给外部访问,但是这种方式实际生产环境不推荐,效率较低,而且 Service 是四层负载
# 查看 service 信息,通过 service 的 cluster ip 进行访问
kubectl get svc
kubectl describe svc nginx-svc
# 查看 pod 信息,通过 pod 的 ip 进行访问
kubectl get po -owide
# 创建其他 pod 通过 service name 进行访问(推荐)
kubectl exec -it busybox -- sh
curl http://nginx-svc
# 默认在当前 namespace 中访问,如果需要跨 namespace 访问 pod,则在 service name 后面加上 .<namespace> 即可
curl http://nginx-svc.default
#根据nodeport从外部访问
创建用于测试的ingress
kubectl create -f ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
name: wolfcode-nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules: # ingress 规则配置,可以配置多个
- host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /api # 等价于 nginx 中的 location 的路径前缀匹配
kubectl get ingress
验证
windows配置hosts加入192.168.50.77 k8s.wolfcode.cn
#注意这里77 是node1,76才是master,如果配置76则浏览器请求失败,因为ingress的安装在node1上
kubectl get po -n ingress-nginx -owide
浏览器请求k8s.wolfcode.cn/api
多域名配置
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
name: wolfcode-nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules: # ingress 规则配置,可以配置多个
- host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /api # 等价于 nginx 中的 location 的路径前缀匹配
- pathType: Exec # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /
- host: api.wolfcode.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /
更多推荐
所有评论(0)