零、前言

本次安装是本人第一次安装成功,之前在垃圾堆里面刨食,在网上找的安装文档从来没成功过。

主要是靠以下这个视频,和视频中提供的资料。建议结合视频和本文进行操作。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

浏览器访问

https://192.168.50.76:31641/

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

官网 Helm | Installing 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: /

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐