Kubernetes集群搭建实战

1.主机名称规划以及环境配置:

序号主机IP主机名规划
1192.168.160.3kubernetes-master.michaelxct.com kubernetes-master
2192.168.160.4kubernetes-node1.michaelxct.com kubernetes-node1
3192.168.160.5kubernetes-node2.michaelxct.com kubernetes-node2
4192.168.160.6kubernetes-register.michaelxct.com kubernetes-register

2.Swap环境配置(所有主机操作)

临时禁用
swapoff -a
•
永久禁用
sed -i 's/.*swap.*/#&/' /etc/fstab 
•
内核参数调整
cat >> /etc/sysctl.d/k8s.conf << EOF
vm.swappiness=0
EOF
sysctl -p /etc/sysctl.d/k8s.conf
•

3.网络参数调整(所有主机操作)

转发 IPv4 并让 iptables 看到桥接流量

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
•
sudo modprobe overlay
sudo modprobe br_netfilter
•
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
•
# 应用 sysctl 参数而不重新启动
sudo sysctl --system

4.安装dock-ce镜像:

# 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
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
•
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.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]
•

5.docker加速器配置:

cat >> /etc/docker/daemon.json <<-EOF
{
  "registry-mirrors": [
    "http://74f21445.m.daocloud.io",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ], 
  "insecure-registries": ["kubernetes-register.michaelxct.com"], 
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
•
systemctl restart docker

6.cri环境操作(所有主机)

下载软件
mkdir /data/softs && cd /data/softs
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2.amd64.tgz
•
解压软件
tar xf cri-dockerd-0.3.2.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/
•
检查效果
cri-dockerd --version
•

定制配置

cat > /etc/systemd/system/cri-dockerd.service<<-EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
•
cat > /etc/systemd/system/cri-dockerd.socket <<-EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
•
[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
•
[Install]
WantedBy=sockets.target
EOF
•
systemctl daemon-reload
systemctl enable cri-dockerd.service
systemctl restart cri-dockerd.service

6.harbor仓库操作

6.1准备工作
安装docker环境
参考 上一节docker环境部署
安装docker-compose
yum install -y docker-compose
6.2获取软件
下载软件
mkdir /data/{softs,server} -p && cd /data/softs
wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgz
解压软件
tar -zxvf harbor-ocffline-installer-v2.5.0.tgz -C  /data/server/
cd /data/server/harbor/
加载镜像
docker load < harbor.v2.5.0.tar.gz
docker images
备份配置
cp harbor.yml.tmpl harbor.yml
6.3修改配置
修改配置
[root@kubernetes-register /data/server/harbor]# vim harbor.yml.tmpl
# 修改主机名
hostname: kubernetes-register.michaelxct.com
http:
port: 80
#https:  注释ssl相关的部分
#  port: 443
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path
# 修改harbor的登录密码
harbor_admin_password: 123456
# 设定harbor的数据存储目录
data_volume: /data/server/harbor/data
配置harbor
./prepare
./install.sh
docker-compose ps
6.4定制服务启动文件
定制服务启动文件 /etc/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
#需要注意harbor的安装位置
ExecStart=/usr/bin/docker-compose --file /data/server/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose --file /data/server/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
加载服务配置文件
systemctl daemon-reload
启动服务
systemctl start harbor
检查状态
systemctl status harbor
设置开机自启动
systemctl enable harbor
6.5harbor仓库定制
浏览器访问域名,用户名: admin, 密码:123456
创建michaelxct用户专用的项目仓库,名称为 michaelxct,权限为公开的
6.6harbor仓库测试
登录仓库
# docker login kubernetes-register.michaelxct.com -u michaelxct
Password:   # 输入登录密码 A12345678a

下载镜像
docker pull busybox

定制镜像标签
docker tag busybox kubernetes-register.michaelxct.com/michaelxct/busybox:v0.1

推送镜像
docker push kubernetes-register.michaelxct.com/michaelxct/busybox:v0.1

7. k8s集群初始化

软件源定制——>安装软件——>镜像获取——>master节点初始化——>node节点加入集群

7.1软件部署
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
更新软件源
yum makecache fast
软件部署
yum install kubeadm kubectl kubelet -y

kubeadm:用来初始化集群的指令。

kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

kubectl:用来与集群通信的命令行工具。

7.2确认基本配置
检查镜像文件列表
kubeadm config images list
images=$(kubeadm config images list --kubernetes-version=1.28.6 | awk -F "/" '{print $NF}')
for i in ${images}
do
  docker pull registry.aliyuncs.com/google_containers/$i
  docker tag registry.aliyuncs.com/google_containers/$i kubernetes-register.sswang.com/google_containers/$i
  docker push kubernetes-register.sswang.com/google_containers/$i
  docker rmi registry.aliyuncs.com/google_containers/$i
done
7.3master节点初始化

环境初始化

master节点初始化

    kubeadm init

node节点初始化

    kubeadm join
kubeadm init --kubernetes-version=1.28.6 \
--apiserver-advertise-address=192.168.160.3 \
--image-repository kubernetes-register.michaelxct.com/google_containers \ 
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=Swap \
--cri-socket=unix:///var/run/cri-dockerd.sock

出现报错1: [WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly error execution phase preflight: [preflight] Some fatal errors occurred: 解决办法: (关闭防火墙)systemctl stop firewalld && systemctl disable firewalld

出现错误2: [ERROR CRI]: container runtime is not running: output: E0124 11:17:04.413998 10544 remote_runtime.go:616] "Status from runtime service failed" err="rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/cri-dockerd.sock: connect: no such file or directory"" 解决办法: 缺少/var/run/cri-dockerd.sock,重新在cri安装时定制配置

出现问题3: 执行kubeadm reset时出现: Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock To see the stack trace of this error execute with --v=5 or higher

解决办法: sudo kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock

7.4node节点加入集群
复制join命令,加入到master集群
kubeadm join 10.0.0.12:6443 --token vudfvt.fwpohpbb7yw2qy49 
--discovery-token-ca-cert-hash sha256:1... ...48545 --cri-socket=unix:///var/run/cri-dockerd.sock
7.5权限操作
定制kubernetes的登录权限
mkdir -p HOME/.kube
cp -i /etc/kubernetes/admin.conf HOME/.kube/config
chown (id -u):(id -g) $HOME/.kube/config
命令补全
放到master主机的环境文件中
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "source <(kubeadm completion bash)" >> ~/.bashrc
source ~/.bashrc
7.6网络环境
网络定制
mkdir /data/kubernetes/flannel -p
cd /data/kubernetes/flannel
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
for i in (grep image kube-flannel.yml | grep -v '#' | awk -F '/' '{print NF}')
do
docker pull flannel/i
    docker tag flannel/i kubernetes-register.michaelxct.com/google_containers/i
    docker push kubernetes-register.michaelxct.com/google_containers/i
docker rmi flannel/$i
done
备份配置文件
cp kube-flannel.yml{,.bak}
修改配置文件
sed -i '/ image:/s/docker.io/flannel/kubernetes-register.michaelxct.com/google_containers/' kube-flannel.yml
应用配置文件
kubectl apply -f kube-flannel.yml
检查效果
kubectl get node

开机自启动的服务:

kubelet

cri-dockerd

docker

8.应用部署

8.1 Kubeadm,Kubelet,Kubectl:

Kubeadm、Kubelet 和 Kubectl 是 Kubernetes 中的三个重要工具,它们分别用于集群的启动、节点管理和命令行操作。下面是它们的详细解释:

  1. kubeadm:

    • Kubeadm 是 Kubernetes 提供的一个命令行工具,用于快速和简化地部署 Kubernetes 集群。它可以在新的集群中初始化控制平面、加入节点、重置集群状态等操作。

    • Kubeadm 的目标是提供一个简单的部署方法,使得用户可以轻松地部署符合生产环境标准的 Kubernetes 集群。它负责初始化 Kubernetes 控制平面的各个组件,并为新节点生成所需的认证信息。

    • 使用 Kubeadm 可以快速搭建 Kubernetes 集群,而不必手动配置复杂的网络和安全设置。它还提供了丰富的配置选项,可以根据需要进行定制。

  2. kubelet:

    • Kubelet 是 Kubernetes 集群中每个节点上的主要组件,负责管理该节点上的 Pod,并与控制平面通信以接收指令。它负责监视 Pod 的运行状态,并在需要时启动、停止或重启 Pod。

    • Kubelet 是 Kubernetes 中运行在每个节点上的代理,它负责执行控制平面发出的容器操作命令,例如创建、删除和监视 Pod。它还负责将节点的资源使用情况报告给控制平面,以便进行资源调度和管理。

  3. kubectl:

    • Kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。它允许用户通过命令行界面管理和操作 Kubernetes 中的各种资源,如 Pod、Service、Deployment 等。

    • Kubectl 可以执行一系列操作,包括创建、查看、更新和删除资源,以及执行诊断和故障排除操作。它是与 Kubernetes 集群进行交互的主要方式,可用于管理集群的各个方面。

    • Kubectl 提供了丰富的子命令和选项,可以满足各种管理和操作需求。用户可以使用 Kubectl 来管理集群的配置、执行应用程序的部署、查看日志和监控数据等。

8.2 Pods,Services,Deployments

在 Kubernetes 中,Pods、Services 和 Deployments 是三个核心概念,它们在应用程序的部署和管理中扮演着重要角色。

  1. Pods:

    • Pod 是 Kubernetes 中最小的可部署和可管理的计算单元。它通常包含一个或多个容器,这些容器共享相同的网络命名空间、存储卷等资源。

    • Pod 代表一个正在运行的应用程序或服务的实例。例如,一个 Pod 可能包含一个 Web 服务器容器和一个附加的辅助容器,用于日志收集或监控。

    • Pod 通常是临时的,即它们可以随着应用程序的需求进行创建、删除或复制。当需要水平扩展或更新应用程序时,可以通过增加或替换 Pod 来实现。

    工作负载有5种类型:

    Deployment:无状态应用部署,一般服务的选择

    StatefulSet:有状态应用部署,redis等服务选择 DaemonSet:确保所有Node运行同一个Pod Job:一次性任务 CronJob:定时任务

  2. Services:

    • Service 是 Kubernetes 中用于公开应用程序的网络端点的抽象。它定义了一组 Pod 的访问方式,而不必了解这些 Pod 的具体位置。

    • Service 可以通过标签选择器与一组 Pod 关联起来,并为这些 Pod 提供一个稳定的虚拟 IP 地址和端口号。这使得其他应用程序可以通过访问 Service 来与这些 Pod 通信,而不必了解 Pod 的具体网络配置。

    • Service 支持不同类型,例如 ClusterIP、NodePort 和 LoadBalancer,以满足不同场景下的网络需求。

  3. Deployments:

    • Deployment 是 Kubernetes 中用于定义 Pod 副本集合、更新策略和滚动升级的控制器。

    • Deployment 允许用户指定要运行的 Pod 副本数量,并定义了如何更新 Pod 的策略。例如,可以指定 Deployment 滚动升级的速率、失败回滚策略等。

    • 使用 Deployment 可以轻松管理应用程序的生命周期。当需要更新应用程序时,可以通过更新 Deployment 的 Pod 模板来实现,Kubernetes 会自动执行滚动升级,确保应用程序的可用性。

    8.3 Labels:

    在Kubernetes(通常简称为k8s)中,labels(标签)是用来标识和组织资源的键值对。每个标签都由一个键和一个对应的值组成。标签可以被附加到Kubernetes中的各种资源对象,如Pods、Services、Deployments等。它们是一种元数据,用于帮助用户和控制器对资源进行分类、过滤、选择和操作。

    一些常见的用途包括:

    1. 标识和选择: 通过标签,可以轻松地选择一组资源,而不需要硬编码资源的名称。例如,可以使用标签来选择应用程序的所有副本,或者选择在特定环境(例如生产或测试)中运行的所有资源。

    2. 路由和负载均衡: 在Service对象中使用标签选择器可以将流量路由到具有特定标签的Pods。

    3. 监控和日志收集: 根据标签选择器,可以设置监控和日志收集工具,以便仅针对具有特定标签的Pods执行操作。

    4. 安全和授权: 可以使用标签来定义安全策略,例如限制哪些Pods可以访问特定的资源。

    5. 版本控制和滚动升级: 使用标签可以轻松地对应用程序进行版本控制,并在滚动升级时逐步将流量转移到新版本的Pods。

8.4 常用的 kubectl 命令:
  1. 查看集群信息:

    • 查看集群节点信息:

      kubectl get nodes
    • 查看所有命名空间的 Pod:

      kubectl get pods --all-namespaces
  2. 查看资源详细信息:

    • 查看 Pod 详细信息:

      kubectl describe pod <pod-name> -n <namespace>
    • 查看服务详细信息:

      kubectl describe service <service-name> -n <namespace>
  3. 创建和管理资源:

    • 创建 Pod、Service 等:

      kubectl create -f <yaml-file>
    • 删除资源:

      kubectl delete pod <pod-name> -n <namespace>
  4. 执行命令:

    • 在 Pod 内执行命令:

      kubectl exec -it <pod-name> -n <namespace> -- <command>
  5. 日志操作:

    • 查看 Pod 日志:

      kubectl logs <pod-name> -n <namespace>
  6. 扩展和缩减应用副本:

    • 扩展 Deployment 的副本数:

      kubectl scale deployment <deployment-name> --replicas=<desired-replica-count>
  7. 应用更新和回滚:

    • 升级应用:

      kubectl set image deployment/<deployment-name> <container-name>=<new-image>
    • 回滚应用:

      kubectl rollout undo deployment/<deployment-name>
  8. 查看和修改配置:

    • 查看配置信息:

      kubectl config view
    • 切换上下文:

      kubectl config use-context <context-name>
  9. 部署和管理 Helm Charts:

    • 安装 Helm Chart:

      helm install <release-name> <chart>
    • 查看 Helm release 列表:

      helm list
  10. 使用标签进行选择:

    • 根据标签选择资源:

      kubectl get pods -l <label-key>=<label-value>
[root@kubernetes-master /data/kubernetes/flannel]#kubectl logs my-nginx
Error from server: Get "https://192.168.160.5:10250/containerLogs/default/my-nginx/my-nginx": dial tcp 192.168.160.5:10250: connect: no route to host
并且ping 192.168.160.5通,而telnet 192.168.160.5 10250 不通
解决办法:关闭防火墙:
sudo systemctl stop firewalld
8.5 资源对象管理实践
kubectl run pod名称 --image=image地址
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: my-pod
  name: my-pod
spec:
  containers:
  - image: kubernetes-register.michaelxct.com/michaelxct/nginx
    name: my-pod
8.6 deployment资源实践
apiVersion: apps/v1
kind: Deployment
metadata:
  name: michaelxct-nginx-proxy
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: kubernetes-register.michaelxct.com/michaelxct/nginx
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: michaelxct-nginx-web
  labels:
    app: nginx-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-web
  template:
    metadata:
      labels:
        app: nginx-web
    spec:
      containers:
      - name: nginx
        image: kubernetes-register.michaelxct.com/michaelxct/nginx_web:v0.1
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: michaelxct-tomcat-web
  labels:
    app: tomcat-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-web
  template:
    metadata:
      labels:
        app: tomcat-web
    spec:
      containers:
      - name: tomcat
        image: kubernetes-register.michaelxct.com/michaelxct/tomcat_web:v0.1
        ports:
        - containerPort: 8080
8.7 资源对象隔离
apiVersion: v1
kind: Namespace
metadata:
  name: my-ns
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: michaelxct-tomcat-web
  namespace: my-ns
  labels:
    app: tomcat-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat-web
  template:
    metadata:
      labels:
        app: tomcat-web
    spec:
      containers:
      - name: tomcat
        image: kubernetes-register.michaelxct.com/michaelxct/tomcat_web:v0.1
        ports:
        - containerPort: 8080
8.8 资源对象的扩缩容

在 Kubernetes 中,可以通过更新 Deployment 对象的 replicas 字段来实现 Pod 的扩容和缩容。Deployment 是一种控制器,负责管理一组 Pod 的副本数量,并根据需要进行自动扩缩容。以下是如何进行扩容和缩容的步骤:

8.9 扩容 Pod:
  1. 使用 kubectl 命令获取当前 Deployment 的配置信息:

    kubectl get deployment <deployment_name> -o yaml
  2. 编辑 YAML 文件,更新 replicas 字段为期望的副本数量:

    spec:
      replicas: <new_replica_count>
  3. 保存并退出编辑器。

  4. 使用 kubectl 应用更新后的配置文件:

    kubectl apply -f <updated_deployment.yaml>
8.10 缩容 Pod:
  1. 使用 kubectl 命令获取当前 Deployment 的配置信息:

    kubectl get deployment <deployment_name> -o yaml
  2. 编辑 YAML 文件,更新 replicas 字段为期望的副本数量:

    spec:
      replicas: <new_replica_count>
  3. 保存并退出编辑器。

  4. 使用 kubectl 应用更新后的配置文件:

    kubectl apply -f <updated_deployment.yaml>

Kubernetes 控制器会根据更新后的配置文件自动执行 Pod 的扩容或缩容操作。在扩容操作中,Kubernetes 会根据副本数量的增加,在集群中添加新的 Pod 副本;在缩容操作中,Kubernetes 会根据副本数量的减少,自动删除多余的 Pod 副本。

请注意,在扩容和缩容操作中,Kubernetes 会根据 Deployment 的配置和策略,自动执行滚动更新,以确保新的 Pod 副本能够平稳地替换旧的 Pod 副本,保证应用程序的可用性和稳定性。

8.11 edit,scale,set

在 Kubernetes 中,editscaleset 是三个不同的 kubectl 子命令,用于对资源进行编辑、扩缩容和设置操作。以下是它们的详细解释:

  1. kubectl edit:

    • kubectl edit 命令用于以文本编辑器的方式编辑指定资源的配置文件,并将编辑后的内容应用到集群中。它会打开一个文本编辑器,允许用户修改指定资源的 YAML 或 JSON 配置文件。

    • 使用 kubectl edit 可以对资源的详细配置进行修改,如 Deployment、Service、Pod 等。例如,可以添加、删除或修改标签、注释、容器规格等配置信息。

    • 例如,编辑名为 my-deployment 的 Deployment 资源:

      kubectl edit deployment/my-deployment
  2. kubectl scale:

    • kubectl scale 命令用于扩展或缩小指定资源的副本数量,例如 Deployment、ReplicaSet 等控制器管理的资源。它会直接更新资源的副本数量字段,而不需要修改配置文件。

    • 语法:kubectl scale deployment <deployment_name> --replicas=<replica_count>

    • 例如,将名为 my-deployment 的 Deployment 资源的副本数量扩展到 3 个:

      kubectl scale deployment my-deployment --replicas=3
  3. kubectl set:

    • kubectl set 命令是一个通用工具,用于设置指定资源的字段值。它支持多种子命令,如设置环境变量、添加标签、设置镜像等操作。

    • 语法:kubectl set <resource> <name> <key>=<value>

    • 例如,给名为 my-pod 的 Pod 添加一个标签:

      kubectl set pod my-pod --labels=new-label=value

总结:kubectl edit 用于编辑资源的配置文件;kubectl scale 用于扩缩容控制器管理的资源的副本数量;kubectl set 则是一个通用工具,用于设置资源的字段值。

9. 应用访问

9.1 Service和Ingress

在 Kubernetes 中,服务访问是一个重要的概念,而 Service 和 Ingress 是两种不同的机制,用于实现服务访问和负载均衡。

9.2 Service 类型
1)ClusterIp(集群内部使用)
 默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP(VIP)。

2)NodePort(对外暴露应用)
在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过NodeIP:NodePort访问来访问该服务。 端口范围:30000~32767

3)LoadBalancer(对外暴露应用,适用于公有云)
在NodePort的基础上,借助Cloud Provider创建一个外部负载均衡器,并将请求转发到NodePort。

4)ExternalName
创建一个dns别名指到service name上,主要是防止service name发生变化,要配合dns插件使用。通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容。这只有 Kubernetes 1.7或更高版本的kube-dns才支持(我这里是Kubernetes 1.22.1版本)。

10. Ingress:

Ingress 是 Kubernetes 中的一种资源对象,用于公开 HTTP 和 HTTPS 服务到集群外部。它充当了从集群外部访问 Service 的入口点,并允许根据域名和路径进行路由和负载均衡。

Ingress 提供了以下功能:

  1. 虚拟主机路由:可以基于域名将流量路由到不同的 Service。

  2. 路径基础的路由:可以基于 URL 路径将流量路由到不同的 Service。

  3. TLS 加密:可以配置 Ingress 使用 TLS 加密以保护传输的数据。

Ingress 控制器是负责实现 Ingress 规则的实际服务,并根据规则将流量转发到适当的后端服务(通常是 Service)的组件。常见的 Ingress 控制器有 Nginx Ingress Controller、Traefik、HAProxy Ingress Controller 等。

综上所述,Service 和 Ingress 是 Kubernetes 中两种不同的机制,用于实现服务访问和负载均衡。Service 用于在集群内部提供服务发现和负载均衡,而 Ingress 则用于从集群外部公开服务,并提供路由和负载均衡功能。配合使用 Service 和 Ingress,可以构建灵活且可扩展的应用程序架构。

9.2 手工创建Service
kubectl expose deployment nginx --port=80 --type=NodePort
9.3 yaml方式创建Service
apiVersion: v1
kind: Service
metadata:
  name: michaelxct-nginx-web
  labels:
    app: nginx-web
spec:
  type: NodePort
  selector:
    app: nginx-web
  ports:
    - protocol: TCP
      name: http
      port: 80
      targetPort: 80
      nodePort: 31080
apiVersion: v1
kind: Service
metadata:
  name: michaelxct-tomcat-web
  labels:
    app: tomcat-web
spec:
  type: NodePort
  selector:
    app: tomcat
  ports:
    - protocol: TCP
      name: http
      port: 8080
      targetPort: 8080
      nodePort: 31880
9.4 部署外部mysql环境
更新系统软件包:
yum makecache fast

安装 MySQL 服务器
yum install mariadb-server mariadb -y 

设置 MySQL 服务在启动时自动启动
systemctl start mariadb.service
systemctl enable mariadb.service
开启 MySQL 服务器远程访问能力
vim /etc/my.cnf.d/server.cnf
[mysqld]
bind-address = 0.0.0.0

重启 MySQL 服务使配置生效
systemctl restart mariadb.service

配置远程主机登录权限
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;"
mysql -uroot -p123456 -e "FLUSH PRIVILEGES;"
主库上创建数据库
mysql -uroot -p123456 -e "
CREATE DATABASE bookinfo default charset utf8 collate utf8_general_ci;
USE bookinfo;
CREATE TABLE book_info (
  id INT AUTO_INCREMENT PRIMARY KEY,
  book_name VARCHAR(100),
  author VARCHAR(100),
  date_of_issue DATE,
  isDelete BOOLEAN
);
INSERT INTO book_info (book_name, author, date_of_issue, isDelete) VALUES
  ('Book 1', 'Author 1', '2022-01-01', FALSE),
  ('Book 2', 'Author 2', '2022-02-01', FALSE),
  ('Book 3', 'Author 3', '2022-03-01', TRUE);
"
apiVersion: v1
kind: Namespace
metadata:
  name: external-ns
---
apiVersion: v1
kind: Endpoints
metadata:
  name: ex-mysql
  namespace: external-ns
subsets:
  - addresses:
      - ip: 10.0.0.18
    ports:
      - port: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: ex-mysql
  namespace: external-ns
spec:
  type: ClusterIP
  ports:
  - port: 3306
    targetPort: 3306
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookinfo
  namespace: external-ns
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask-bookinfo
  template:
    metadata:
      labels:
        app: flask-bookinfo
    spec:
      containers:
        - name: flask-bookinfo
          image: kubernetes-register.michaelxct.com/michaelxct/flask_bookinfo:2.3.2
          imagePullPolicy: Always
          ports:
            - containerPort: 5000
          env:
            - name: DB_HOST
              value: "ex-mysql"
            - name: DB_USER
              value: "root"
            - name: DB_PASSWORD
              value: "123456"
            - name: DB_DATABASE
              value: "bookinfo"

11. 应用数据

11.1 k8s应用数据类型和步骤解析

11.2 k8s使用各种数据类型的配置

11.3 emptyDir实践
apiVersion: v1
kind: Pod
metadata:
  name: michaelxct-emptydir
spec:
  containers:
  - name: nginx-web
    image: kubernetes-register.michaelxct.com/michaelxct/nginx_web:v0.1
    volumeMounts:
    - name: nginx-index
      mountPath: /usr/share/nginx/html
  - name: change-index
    image: kubernetes-register.michaelxct.com/michaelxct/busybox:1.28
    # 每过2秒更改一下文件内容
    command: ['sh', '-c', 'for i in $(seq 100); do echo index-$i > /testdir/index.html;sleep 2;done']
    volumeMounts:
    - name: nginx-index
      mountPath: /testdir
  volumes:
  - name: nginx-index
    emptyDir: {}
11.4 hostPath实践
apiVersion: v1
kind: Pod
metadata:
  name: michaelxct-hostpath
spec:
  volumes:
  - name: redis-backup
    hostPath:
     path: /data/backup/redis
  containers:
    - name: hostpath-redis
      image: kubernetes-register.michaelxct.com/michaelxct/redis:7.0.4
      volumeMounts:
       - name: redis-backup
         mountPath: /data

12.应用配置

12.1 定制配置文件实践
apiVersion: v1
kind: ConfigMap
metadata:
  name: michaelxct-nginxconf
data:
  default.conf: |
    server {
        listen 80;
        server_name www.michaelxct.com;
        location /nginx {
          proxy_pass http://michaelxct-nginx-web/;
        }
        location /tomcat {
          proxy_pass http://michaelxct-tomcat-web:8080/;
        }
        location / {
            root /usr/share/nginx/html;
        }
    }
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: michaelxct-nginx-index
data:
  index.html: "Hello Nginx, This is Nginx Web Page by michaelxct!!!\n"
apiVersion: apps/v1
kind: Deployment
metadata:
  name: michaelxct-nginx-proxy
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: kubernetes-register.michaelxct.com/michaelxct/nginx_proxy:v0.1
        volumeMounts:
        - name: nginxconf
          mountPath: /etc/nginx/conf.d/
          readOnly: true
        - name: nginxindex
          mountPath: /usr/share/nginx/html/
          readOnly: true
      volumes:
      - name: nginxconf
        configMap:
          name: michaelxct-nginxconf
      - name: nginxindex
        configMap:
          name: michaelxct-nginx-index
---
apiVersion: v1
kind: Service
metadata:
  name: superopsmsb-nginx-proxy
  labels:
    app: superopsmsb-nginx-proxy
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      name: http
      port: 80
      targetPort: 80
12.2 敏感文件实践
准备nginx容器的配置目录
mkdir tls-key

做证书
openssl  genrsa -out tls-key/tls.key 2048

做成自签证书
openssl req  -new -x509 -key tls-key/tls.key  -out tls-key/tls.crt -subj "/CN=www.michaelxct.com"
定制专属nginx配置文件  nginx-conf-tls/default.conf
server {
    listen 443 ssl;
    server_name www.michaelxct.com;
    ssl_certificate /etc/nginx/certs/tls.crt; 
    ssl_certificate_key /etc/nginx/certs/tls.key;
    location / {
        root /usr/share/nginx/html;
    }
}

server {
    listen 80;
    server_name www.michaelxct.com; 
    return 301 https://$host$request_uri; 
}

手工创建资源对象文件

创建cm资源对象
kubectl create configmap nginx-ssl-conf --from-file=nginx-conf-tls/

创建secret资源对象
kubectl create secret tls nginx-ssl-secret --cert=tls-key/tls.crt --key=tls-key/tls.key
apiVersion: v1
kind: Pod
metadata:
  name: michaelxct-nginx-ssl
spec:
  containers:
  - image: kubernetes-register.michaelxct.com/michaelxct/nginx_web:v0.1
    name: nginx-web
    volumeMounts:
    - name: nginxcerts
      mountPath: /etc/nginx/certs/
      readOnly: true
    - name: nginxconfs
      mountPath: /etc/nginx/conf.d/
      readOnly: true
  volumes:
  - name: nginxcerts
    secret:
      secretName: nginx-ssl-secret
  - name: nginxconfs
    configMap:
      name: nginx-ssl-conf

13. 服务访问

13.1 原理解析
Ingress是授权入站连接到达集群服务的规则集合。
    从外部流量调度到nodeport上的service
    从service调度到ingress-controller
    ingress-controller根据ingress[Pod]中的定义(虚拟主机或者后端的url)
    根据虚拟主机名直接调度到后端的一组应用pod中

13.2 Ingress部署
获取配置文件
cd /data/kubernetes/app_secure
mkdir ingress ; cd ingress
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/baremetal/deploy.yaml
mv deploy.yaml ingress-deploy.yaml
cp ingress-deploy.yaml{,.bak}
默认镜像
grep image: ingress-deploy.yaml | awk -F '/|@' '{print $(NF-1)}' | uniq
controller:v1.3.1
kube-webhook-certgen:v1.3.0

获取镜像
for i in nginx-ingress-controller:v1.3.1 kube-webhook-certgen:v1.3.0
do
  docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$i
  docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$i kubernetes-register.michaelxct.com/google_containers/$i
  docker push kubernetes-register.michaelxct.com/google_containers/$i
  docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$i
done
注意:
	controller的名称是需要更改一下,阿里云的镜像名称多了一个标识
修改基础镜像
grep image: ingress-deploy.yaml
          image: kubernetes-register.michaelxct.com/google_containers/nginx-ingress-controller:v1.3.1
          image: kubernetes-register.michaelxct.com/google_containers/kube-webhook-certgen:v1.3.0
          image: kubernetes-register.michaelxct.com/google_containers/kube-webhook-certgen:v1.3.0
        
开放访问入口地址  
vim ingress-deploy.yaml
...
334 apiVersion: v1
335 kind: Service
...
344   namespace: ingress-nginx
345 spec:
      ...
348   ipFamilyPolicy: SingleStack
349   externalIPs: ['10.0.0.12']			# 限制集群外部访问的入口ip
350   ports:
351   - appProtocol: http
352     name: http
353     port: 80
...
628   failurePolicy: Ignore				    # 为了避免默认的准入控制限制,改为Ignore
...
应用资源配置文件
kubectl apply -f ingress-deploy.yaml

确认效果
kubectl get all -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-s5p7h        0/1     Completed   0          105s
pod/ingress-nginx-admission-patch-qnjmv         0/1     Completed   0          105s
pod/ingress-nginx-controller-6cc467dfd9-c2dfg   1/1     Running     0          105s

NAME                                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.109.163.145   10.0.0.12     80:30439/TCP,443:31912/TCP   105s
service/ingress-nginx-controller-admission   ClusterIP   10.96.223.121    <none>        443/TCP                      105s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           105s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-6cc467dfd9   1         1         1       105s

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           8s         105s
job.batch/ingress-nginx-admission-patch    1/1           7s         105s
测试访问页面
curl 10.0.0.12:30439
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
13.3 Ingress实践
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: superopsmsb-ingress-mulhost
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: nginx.michaelxct.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: michaelxct-nginx-web
            port:
              number: 80
  - host: tomcat.michaelxct.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: michaelxct-tomcat-web
            port:
              number: 8080

14. helm管理

14.1 helm介绍
helm的功能类似于yum 或 apt,提供应用部署时候所需要的各种配置、资源清单文件,他与yum之类工具不同的是,在k8s中helm是不提供镜像的,这些镜像文件需要由专门的镜像仓库来提供。
​
    例如:k8s平台上的nginx应用部署,对于该应用部署来说,主要需要三类内容:
        镜像:nginx镜像
        资源定义文件:Deployment、service、hpa等
        专用文件:配置文件、证书等
        helm管理的主要是:资源定义文件和专用文件。
​
14.2 helm部署
下载软件
cd /data/softs
wget https://get.helm.sh/helm-v3.13.0-linux-amd64.tar.gz
​
配置环境
mkdir /data/server/helm/bin -p
tar xf helm-v3.13.0-linux-amd64.tar.gz
mv linux-amd64/helm /data/server/helm/bin/
​
环境变量
# cat /etc/profile.d/helm.sh
#!/bin/bash
# set helm env
export PATH=$PATH:/data/server/helm/bin
​
chmod +x /etc/profile.d/helm.sh
source /etc/profile.d/helm.sh
​
确认效果
# helm  version
version.BuildInfo{Version:"v3.13.0", GitCommit:"1d11fcb5d3f3bf00dbe6fe31b8412839a96b3dc4", GitTreeState:"clean", GoVersion:"go1.16.9"}
​

14.3 helm实践

添加仓库 
helm repo add az-stable http://mirror.azure.cn/kubernetes/charts/
helm repo add bitnami https://charts.bitnami.com/bitnami
​
查看仓库
# helm repo list
NAME            URL
az-stable       http://mirror.azure.cn/kubernetes/charts/
bitnami         https://charts.bitnami.com/bitnami
​
更新仓库属性信息
helm repo update
​
搜索chart信息
# helm search --help
...
Available Commands:
  hub         search for charts in the Artifact Hub or your own hub instance
  repo        search repositories for a keyword in charts
  结果显示:
    helm 有两种搜索的源地址,官方的在 Artifact,幸运的是,无法访问。
​
从自定义仓库中获取源信息
helm search repo redis
​
查看chart的所有信息
helm show all bitnami/redis
​
安装chart
helm install my_helm bitnami/redis
​
删除应用
helm uninstall my-helm
​
更新应用
helm install my-helm bitnami/redis --set master.persistence.enabled=false --set replica.persistence.enabled=false
​
查看效果
helm list
kubectl get pod
​
查看基本操作的信息
helm status my-helm
​
获取具备读写权限的主机域名
    redis主角色主机: my-helm-redis-master.default.svc.cluster.local
    redis从角色主机: my-helm-redis-replicas.default.svc.cluster.local
 
获取连接密码
# export REDIS_PASSWORD=$(kubectl get secret --namespace default my-helm-redis -o jsonpath="{.data.redis-password}" | base64 --decode)
# echo $REDIS_PASSWORD
ID6KzPAZc1
​
创建客户端
# kubectl run --namespace default redis-client --restart='Never'  --env REDIS_PASSWORD=$REDIS_PASSWORD  --image docker.io/bitnami/redis:6.2.6-debian-10-r0 --command -- sleep infinity
​
连接redis主角色
$ redis-cli -h my-helm-redis-master.default.svc.cluster.local -a ID6KzPAZc1
​
redis操作
my-helm-redis-master.default.svc.cluster.local:6379> set a 1
OK
my-helm-redis-master.default.svc.cluster.local:6379> set b 2
OK
my-helm-redis-master.default.svc.cluster.local:6379> keys *
1) "a"
2) "b"
my-helm-redis-master.default.svc.cluster.local:6379> get a
"1"
​

六.etcd

1.什么是etcd

etcd 是一个开源的分布式键值存储,用于保存和管理分布式系统保持运行所需的关键信息。最值得注意的是,它管理流行的容器编排平台 Kubernetes 的配置数据、状态数据和元数据。

与所有分布式工作负载一样,容器化工作负载具有复杂的管理要求,这些要求会随着工作负载的扩展而变得更加复杂。Kubernetes通过协调所有集群(可以在多个位置的多台计算机上运行)等任务,例如配置、部署、服务发现、负载均衡、作业调度和运行状况监控,从而简化了管理这些工作负载的过程。

但为了实现这种协调,Kubernetes 需要一个数据存储,该数据存储在任何给定时间点提供关于系统状态(其所有集群和 Pod 以及其中的应用程序实例)的单一、一致的真实来源。etcd 是用于创建和维护此真实版本的数据存储。

2.为什么选择etcd

作为保持分布式工作负载运行的数据主干并非易事。但 etcd 是为这项任务而构建的,从头开始设计,具有以下特性:

  • 完全复制:etcd 集群中的每个节点都可以访问完整的数据存储。

  • 高可用性:etcd 被设计为没有单点故障,并且可以优雅地容忍硬件故障和网络分区。

  • 可靠一致: 每个数据“读取”都会返回所有集群中的最新数据“写入”。

  • 快速:etcd 的基准测试为每秒 10,000 次写入。

  • 安全: etcd 支持自动传输层安全性 (TLS) 和可选的安全套接字层 (SSL) 客户端证书身份验证。由于 etcd 存储了重要且高度敏感的配置数据,因此管理员应在部署中实施基于角色的访问控制,并确保与 etcd 交互的团队成员被限制在执行其工作所需的最低特权访问级别。

  • 简单: 任何应用程序,从简单的 Web 应用程序到高度复杂的容器编排引擎(如 Kubernetes),都可以使用标准的 HTTP/JSON 工具在 etcd 中读取或写入数据。

3.etcd和kubernetes

https://flowus.cn/share/8e6807a5-3aca-46bf-b69d-e131b90f5e02?code=A8RVP2
【FlowUs 息流】Kubernetes集群搭建实战:

  • 47
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值