0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

K8S落地实践经验分享

马哥Linux运维 来源:稀土掘金技术社区 2024-01-02 11:45 次阅读

前言

k8s 即 Kubernetes,是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理
本篇文章将分享 k8s v1.18.8 的安装,以及其面板,监控,部署服务,使用Ingress-Ningx进行负载均衡的实践
因为公司用的这个老版本,并且后面要负责搭建,担心无法复刻,趁此周末,实践一二,确认可行,遂与君分享。

虚拟机准备

宿主机:Windows10

虚拟机工具:Hyper-V 10.0.19041.1

虚拟机 Linux 系统:CentOS 8.5

已安装软件:docker (v2.21.0)及 docker compose(24.0.6)

Hyper-V虚拟机一览

6c25d238-a8a7-11ee-8b88-92fbcf53809c.jpg

IP 及主机名

192.168.123.100 master
192.168.123.101 worker01
192.168.123.102 worker02

CentOS8.5 设置固定 IP

设置IP及网关:vi /etc/sysconfig/network-scripts/ifcfg-eth0


TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0
ONBOOT=yes
PREFIX=24
IPV6_PRIVACY=no


BOOTPROTO=static
IPADDR=192.168.123.100
GATEWAY=192.168.123.1

CentOS8.5 联网检查

配置好网络后先测试 curl 是否可以正常访问网络curl ``http://mirrors.aliyun.com,如果提示:curl: (6) Could not resolve host: ``mirrors.aliyun.com,则需要检查dns设置

cat /etc/resolv.conf默认应该是网关的地址,也可以自行修改为其他公共dns

nameserver 192.168.123.1

CentOS8.5 设置主机名

查看主机信息:hostnamectl,通过导入虚拟机创建的主机信息除了mac地址其他基本都一样

设置主机名:hostnamectl set-hostname 主机名


# 查看hostname
hostnamectl --static
#设置 hostname 对应机器设置
# 192.168.123.100
hostnamectl set-hostname master
# 192.168.123.101
hostnamectl set-hostname worker01
# 192.168.123.102
hostnamectl set-hostname worker02

确保每个节点上 MAC 地址的唯一性

可以在外部使用 PowerShell 查看 Hyper-V 虚拟机的地址,在导入时选择新注册会自动生成 Mac 地址,无需更改

centos8.5 查看mac地址:ip link show dev eth0

6c2fbdde-a8a7-11ee-8b88-92fbcf53809c.jpg

外部使用 PowerShell 查看:(Get-VMNetworkAdapter -VMName "k8s-master").MacAddress

6c495b36-a8a7-11ee-8b88-92fbcf53809c.jpg

确保 product_uuid 的唯一性

执行sudo cat /sys/class/dmi/id/product_uuid查看product_uuid我这里因为都是复制的虚拟机,查出来是一样的的,所以需要修改

6c5a18cc-a8a7-11ee-8b88-92fbcf53809c.jpg

修改需要关闭虚拟机后执行PowerShell脚本 ,文章总结

外部查看Hyper-V虚拟机 UUID


Get-VM "k8s-master" | % { (gwmi -Namespace rootvirtualizationv2 -Class msvm_computersystem -Filter ('ElementName="{0}"' -f $_.Name)).GetRelated('msvm_virtualsystemsettingdata') | select BIOSGUID }
Get-VM "k8s-worker01" | % { (gwmi -Namespace rootvirtualizationv2 -Class msvm_computersystem -Filter ('ElementName="{0}"' -f $_.Name)).GetRelated('msvm_virtualsystemsettingdata') | select BIOSGUID }
Get-VM "k8s-worker02" | % { (gwmi -Namespace rootvirtualizationv2 -Class msvm_computersystem -Filter ('ElementName="{0}"' -f $_.Name)).GetRelated('msvm_virtualsystemsettingdata') | select BIOSGUID }





PowerShell 修改 Hyper-V虚拟机 UUID


$VMname="k8s-master"
$vmx = Get-WmiObject -Namespace rootvirtualizationv2 -Class msvm_virtualsystemsettingdata 


$CurrentSettingsData = $vmx | Where-Object { $_.ElementName -eq $VMname }


$CurrentSettingsData.BIOSGUID


$GUID = [System.Guid]::NewGuid()


$CurrentSettingsData.BIOSGUID = "{" + $GUID.Guid.ToUpper() + "}" 


$VMMS = Get-WmiObject -Namespace rootvirtualizationv2 -Class msvm_virtualsystemmanagementservice
$ModifySystemSettingsParams = $VMMS.GetMethodParameters('ModifySystemSettings')


$ModifySystemSettingsParams.SystemSettings = $CurrentSettingsData.GetText([System.Management.TextFormat]::CimDtd20)


$VMMS.InvokeMethod('ModifySystemSettings', $ModifySystemSettingsParams, $null)


开机后查询可以看到已经修改成功

6c6b7130-a8a7-11ee-8b88-92fbcf53809c.jpg

确保 Machine ID 的唯一性

执行/etc/machine-id或使用 hostnamectl 发现机器id是一样的

6c7b6734-a8a7-11ee-8b88-92fbcf53809c.jpg

重新生成了机器id


sudo cp /etc/machine-id /etc/machine-id.backup
sudo rm /etc/machine-id
sudo systemd-machine-id-setup
cat /etc/machine-id

执行结果

6c8b5c20-a8a7-11ee-8b88-92fbcf53809c.jpg

检查端口是否被占用

6ca542b6-a8a7-11ee-8b88-92fbcf53809c.jpg

centos8.5 使用 ss 查询端口是否使用


ss -tuln | grep -E "6443|2379|2380|10250|10259|10257|30000-32767"


执行结果,无占用

6cbdb530-a8a7-11ee-8b88-92fbcf53809c.jpg

安装 K8S v1.18.8

都2023年了,为什么还是 v1.18.8?

因为公司用的这个版本,并且后面要负责搭建,趁此周末,实践一二,确认可行,遂与君分享。

节点初始化

执行主机:master,worker01,worker02

关闭防火墙

关闭swap分区

允许 iptables 检查桥接流量

添加阿里云 yum 源


# 关闭防火墙
systemctl stop firewalld
# 设置永久不开启防火墙
systemctl disable firewalld


# 关闭swap 分区 
swapoff -a   
#永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab


# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config


# 允许 iptables 检查桥接流量
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF


# 添加阿里云 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

执行主机:master,worker01,worker02

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

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

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


# 安装
yum install -y kubeadm-1.18.8 kubelet-1.18.8 kubectl-1.18.8 ipvsadm
# 自启
sudo systemctl enable --now kubelet


验证是否安装完成

kubelet --version

kubeadm version

kubectl version

安装容器

执行主机:master,worker01,worker02

在 Docker 19.x 版本之前,Docker 使用自己的容器运行时(称为 Docker Runtime)。从 Docker 19.x 版本开始,Docker Engine 开始使用 containerd 作为默认的容器运行时,以提供更稳定、可靠的容器管理功能。

k8s v1.18.8 版本,安装docker v24 暂未遇到问题

判断是否启用:systemctl status containerd

安装docker及container


curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
rm /etc/yum.repos.d/CentOS-Linux-AppStream.repo -f
rm /etc/yum.repos.d/CentOS-Linux-BaseOS.repo -f
dnf clean all
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce-3:24.0.0-1.el8 docker-ce-cli-1:24.0.6-1.el8 containerd.io docker-buildx-plugin docker-compose-plugin







可参考Docker V24 及 Docker Compose V2 的安装及使用

设置节点网络的别名

执行主机:master,worker01,worker02

cat >> /etc/hosts << EOF
192.168.123.100 master
192.168.123.101 worker01
192.168.123.102 worker02
EOF

初始化集群

执行主机:master

--apiserver-advertise-address:指定通讯节点,使用master节点即可

--image-repository:k8s官网镜像库

--service-cidr: svc网络的ip段设置

--pod-network-cidr:pod的ip段配置,每个pod都会有自己的ipkube-flannel.yml默认 10.244.0.0/16


kubeadm init 
  --apiserver-advertise-address=192.168.123.100 
  --image-repository registry.aliyuncs.com/google_containers 
  --kubernetes-version v1.18.8 
  --service-cidr=10.10.0.0/16 
  --pod-network-cidr=10.244.0.0/16 
  --ignore-preflight-errors=all

执行结果,创建成功

6cca662c-a8a7-11ee-8b88-92fbcf53809c.jpg

输出结果如下


您的Kubernetes控制平面已成功初始化!


要开始使用集群,非root用户需要使用以下操作:


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


您现在应该向集群部署一个pod网络。
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
  
然后,您可以通过以root身份在每个工作节点上运行以下操作来加入任意数量的工作节点:
kubeadm join 192.168.123.100:6443 --token nn9das.wslckjkd1ng3oxui 
    --discovery-token-ca-cert-hash sha256:7b3f413e6bfbd1f91448460426a144741bd14c2bb3119cfa058d07d65ab329fd


配置集群身份验证文件


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

若不配置直接使用 kubectl 相关命令会提示:The connection to the server ``localhost:8080`` was refused - did you specify the right host or port?

想要在哪里管理k8s 就要将 .kube 文件夹拷贝到目标主机,即工作节点需要复制 .kube 目录到 $HOME 目录中

安装网络插件 flannel

下载kube-flannel.yml

若初始化时指定了 --pod-network-cidr 则需要修改配置中 net-conf.json:Network 项

执行安装


kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml --insecure-skip-tls-verify

worker节点配置

执行主机:worker01,worker02

根据前面的 环境设置,k8s工具安装,docker安装,在worker节点也执行,进行初始化

将worker节点加入集群:执行master初始化后输出的join命令

kubeadm join 192.168.123.100:6443 
    

若找不到或失效可通过:kubeadm token create --print-join-command重新生成join命令

复制 master 节点的k8s配置文件 $HOME/.kube/config 到工作节点

安装网络插件 flannel


khttps://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml --insecure-skip-tls-verify

安装 Dashboard v2.0.3

Kubernetes Dashboard 是一个用于管理和监控 Kubernetes 集群的 Web 用户界面。它提供了一个直观的图形界面,可以帮助你查看和管理集群中的各种资源、部署应用程序、监控集群状态等

官方仓库

执行recommended.yaml, 安装面板,完全支持的版本为v2.0.3

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

若需要修改token默认15分钟的过期时间为7天,修改对应参数即可

args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
- --token-ttl=604800

默认创建的 kubernetes-dashboard 无权限,所以需要授权,这里直接创建使用命令创建一个新用户 admin 并授权

创建用户


cat <

角色授权


cat <

获取登陆token


kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep kubernetes-dashboard| awk '{print $1}')


[root@master ~]
Name:         admin-token-4nqqz
Namespace:    kubernetes-dashboard
Labels:       
Annotations:  kubernetes.io/service-account.name: admin
              kubernetes.io/service-account.uid: 6f432133-5007-4d8b-9239-8c55efa03826


Type:  kubernetes.io/service-account-token


Data
====
ca.crt:     1025 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlUycUl0Zmpnb0Y4Z2FWXzVkbmtjSjR6UngwNW05Z0tDcjVydklLWURYY1EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi00bnFxeiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjZmNDMyMTMzLTUwMDctNGQ4Yi05MjM5LThjNTVlZmEwMzgyNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbiJ9.J8nXyfpWjs9IbnvdfrW5hSq5SkCWy16NL89nphiDk-UGZP0qbcx0xQG_IfmTUfO0lxDQdD84VyZ8EzLENtwtqt3oIVZQyyyUAonOzqnAUfN3l9Jd_uFVbZhS_tfnwC3p4z2htUpDfXNLFoA4hav-2EgT6wY3voIZtnarfNvvBCBCimi-pG4AcCvc34V_udpYRXYpP1IPswS82NMTBVt_T1Y8gm_zKwq8LH6Z4LYr6wdr3MxGT4Fr7H5GK1jVS_wbna06HEK-GI_szNf5u-zRTMP5Si4JOHxnEWwHH4keLG6ez0pwkk5jYTqncczeb91Es_zZE95rvLxn1yh2mzAP5g

暴露到集群外


kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort","ports":[{"port":443,"targetPort":8443,"nodePort":30001}]}}'

使用 Chrome 访问:https://192.168.123.102:30001/#/login

6cddc762-a8a7-11ee-8b88-92fbcf53809c.jpg

因为要求必须要使用https,所以结合之前文章**前后端都用得上的 Nginx 日常使用经验**,生成证书并添加域名配置


server {


    listen 80
    listen       443 ssl
    server_name k8s.devops.test.com


    ssl_certificate      /certs/k8s.devops.test.com/server.crt
    ssl_certificate_key  /certs/k8s.devops.test.com/server.key
    ssl_session_cache    shared1m
    ssl_session_timeout  5m
    ssl_ciphers  HIGH!MD5
    ssl_prefer_server_ciphers  on


    location / {
            proxy_pass https://192.168.123.100:30001
            proxy_http_version 1.1
            proxy_buffering off
            proxy_request_buffering off
            proxy_set_header Upgrade $http_upgrade
            proxy_set_header Connection "upgrade"
            proxy_set_header Host $host
            proxy_set_header X-Forwarded-For $remote_addr
    }
}

成功使用https+域名访问

6cf8a0c8-a8a7-11ee-8b88-92fbcf53809c.jpg

切换面板版本 v2.2.0 ,可以更好的显示 ingress 相关信息


kubectl -n kubernetes-dashboard delete $(kubectl -n kubernetes-dashboard get pod -o name | grep dashboard)


kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

安装 Metrics Server v0.3.7

Metrics Server 是一个用于收集集群中各个组件的资源使用情况和性能指标数据的组件。安装后可以在面板中或使用命令 kubectl top node 查看集群使用情况

官方仓库

k8s v1.18 对应可以使用v0.3.7部署文件 metrics-server/deploy/1.8+/

修改配置 metrics-server-deployment.yaml

修改镜像源:registry.aliyuncs.com/google_containers

新增command配置跳过证书的验证:-kubelet-insecure-tls

设置首选通信类型:--kubelet-preferred-address-

types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname


spec:
      serviceAccountName: metrics-server
      volumes:
      
      - name: tmp-dir
        emptyDir: {}
      containers:
      - name: metrics-server
        
        image: registry.aliyuncs.com/google_containers/metrics-server:v0.3.7
        imagePullPolicy: IfNotPresent
        
        command:
        - /metrics-server
        
        - --kubelet-insecure-tls
        
        - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname

拷贝文件到服务器或直接在master节点修改

到考本文件的目录执行命令安装即可


cd /app/k8s/
kubectl apply -f metrics-server-0.3.7/deploy/1.8+/

目录结构及修改

6d0a4a94-a8a7-11ee-8b88-92fbcf53809c.jpg

执行成功

6d186066-a8a7-11ee-8b88-92fbcf53809c.jpg

等待pod部署成功后刷新页面可以看到监控就出来了

6d260b94-a8a7-11ee-8b88-92fbcf53809c.jpg

6d41e918-a8a7-11ee-8b88-92fbcf53809c.jpg

使用kubectl top node查看节点资源使用情况

6d562d56-a8a7-11ee-8b88-92fbcf53809c.jpg

使用kubectl top pod -A查看 Pod 资源使用情况

安装 Helm v3.13.1

Kubernetes Helm 是一个包管理工具,用于在 Kubernetes 环境中简化应用程序的部署和管理。Helm 允许你定义、安装和升级 Kubernetes 应用程序的预定义软件包,这些软件包称为 Helm Charts。

官方仓库

安装v3版本


curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash


安装成功,版本为 v3.13.1

6d5f7758-a8a7-11ee-8b88-92fbcf53809c.jpg

安装目录:/usr/local/bin/helm

可以看到有一个警告说没有安装git, 因为 Helm 在安装插件(push插件)时需要使用 Git,所以可以顺手安装一下 git

sudo dnf install git -y

查看Helm仓库列表:helm repo list,默认为空,如果要按照什么应用,需要添加对应的仓库

helm 搜索应用:helm search repo ingress-nginx/ingress-nginx --version='<4'

helm 卸载应用:helm uninstall -n ingress-nginx ingress-nginx

具体使用可参考下面安装 ingress-nginx

在 Helm 中修改镜像源需要使用--set或--set-string参数来覆盖默认值。对于 Nginx Ingress Controller,可以通过指定controller.image.repository和controller.image.tag来修改镜像源的包地址和版本。这个在安装ingress-nginx就有使用,在无法使用官方镜像的时候一般都需要替换为国内镜像

使用 K8S 集群部署服务

常用命令

部署服务:kubectl apply -f 配置文件名.yml

查看副本集信息:kubectl get replicasets

[root@master tests]
NAME                  DESIRED   CURRENT   READY   AGE
my-nginx-69448bd7d9   2         2         2       36m

查看 Deployment 信息:kubectl describe deployments my-nginx

6d6c86f0-a8a7-11ee-8b88-92fbcf53809c.jpg

查看 Service 信息:kubectl get services my-nginx-service

[root@master tests]
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
my-nginx-service   NodePort   10.10.143.180           80:30080/TCP   35m

集群中可以使用此服务IP进行通讯

6d8d9f52-a8a7-11ee-8b88-92fbcf53809c.jpg

查看部署的 nginx 服务的 Pod :kubectl get pods --selector=app=my-nginx

[root@master tests]
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-69448bd7d9-q8xtl   1/1     Running   0          39m
my-nginx-69448bd7d9-zghxb   1/1     Running   0          30m

删除服务:kubectl delete services my-nginx-service

删除负载:kubectl delete deployment my-nginx

部署一个 nginx 服务

配置一个简单的 nginx 服务:nginx.yml

部署了 Deployment 和 Service

暴露了容器的端口:80

暴露集群外的端口:30080

设置了2个副本:replicas: 2

完整配置文件


apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
        - name: my-nginx
          image: nginx:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-service
spec:
  selector:
    app: my-nginx
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080

上传到服务器执行:kubectl apply -f nginx.yml

部署成功后使用节点IP+端口号即可访问

6d9fa364-a8a7-11ee-8b88-92fbcf53809c.jpg

目前部署了两个服务,但是可以目前没有能够设置负载的地方,所以还需要一个 Ingress 控制器来管理流量和负载均衡

使用 Ingress-Nginx v3.41进行服务负载

Kubernetes 默认使用的负载均衡算法是基于 IP 的轮询(IP-based round-robin),它会将请求按照源 IP 地址的顺序分发到不同的 Pod 上。如果需要其他负载均衡算法,可以使用 Ingress 控制器或者自定义的负载均衡解决方案

如果使用 Kubernetes 1.19 或更高版本,可以使用最新版本的 NGINX Ingress Controller;

如果使用旧版本的 Kubernetes(1.18 或更早版本),则必须使用 Ingress-Nginx Controller 的 0.X 版本(例如 0.49 版本

准备

官方仓库

版本选择说明

ArtifactHub:v3.41

使用 helm 查找 ingress-nginx 包


# 查询仓库列表
helm repo list
# 添加仓库地址
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# 搜索包
helm search repo ingress-nginx/ingress-nginx --version='<4'
# ingress-nginx/ingress-nginx     3.41.0          0.51.0          Ingress controller for Kubernetes using NGINX a


安装

创建 namespace

kubectl create namespace ingress-nginx

安装 ingress-nginx 源下的 v3.41 版本 ingress-nginx, 指定 namespace 为 ingress-nginx,指定镜像源为阿里云


helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --version 3.41.0 --set controller.image.repository=registry.aliyuncs.com/google_containers/nginx-ingress-controller

如果安装后报错负载无法启动,可能是因为包无法拉取,可指定镜像源--set controller.image.repository为国内源(registry.aliyuncs.com/google_containers/nginx-ingress-controller) 重新安装(卸载helm uninstall -n ingress-nginx ingress-nginx)即可

安装成功,并给出提示应该如何使用

6db0e85e-a8a7-11ee-8b88-92fbcf53809c.jpg

如果需要在局域网中使用,还需要修改两个配置

修改负载 ingress-nginx-controller 配置 保存后生效

dnsPolicy: ClusterFirstWithHostNet策略将首先尝试使用主机的 DNS 解析服务来解析域名,如果主机的 DNS 无法解析该域名,将会尝试使用其他配置的 DNS 解析器

hostNetwork:truePod 中的容器将使用主机的网络栈和网络配置

6dcafc80-a8a7-11ee-8b88-92fbcf53809c.jpg

使用

通过 Dashboard 右上角直接创建 YAML 文件


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx-test
  namespace: default
spec:
  rules:
  - host: nginx.k8stest.com
    http:
      paths:
      - backend:
          serviceName: my-nginx-service
          servicePort: 80

保存后将会转发域名请求到前面部署的 my-nginx-service 服务中,此时将使用 ingress-nginx 进行负载,当然,还需要将域名解析到目标服务器,本地局域网可以使用 hosts 或者 dns 设置

通过kubectl describe pod ingress-nginx-controller -n ingress-nginx可获取到ingress-nginx所在节点信息,IP为 192.168.123.102

6ddf0c66-a8a7-11ee-8b88-92fbcf53809c.jpg

设置 hosts192.168.123.102 nginx.k8stest.com,再刷新下dns缓存ipconfig /flushdns访问即可,每次刷新都会请求到不同的pod上面

6df3e028-a8a7-11ee-8b88-92fbcf53809c.jpg

至此,在局域网中安装使用 k8s v1.18.8,并进行相关配置已经完成,得益与大佬们的分享,耗时两天,边弄边记,优化了一些步骤与细节。后续将尝试安装更新的版本,敬请期待。

踩坑记录

使用yum安装kubeadm时报错,测试发现curl无法使用,错误如下,需要检查设置dns:cat /etc/resolv.conf写入默认配置或公告dns: nameserver 192.168.123.1

[root@master ~]# yum install -y kubeadm-1.18.8 kubelet-1.18.8 kubectl-1.18.8 ipvsadm
Repository extras is listed more than once in the configuration
CentOS-8.5.2111 - Base - mirrors.aliyun.com                                                                                                                  0.0  B/s |   0  B     00:00
Errors during downloading metadata for repository 'base':
  - Curl error (6): Couldn't resolve host name for http://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/repodata/repomd.xml [Could not resolve host: mirrors.aliyun.com]
  - Curl error (6): Couldn't resolve host name for http://mirrors.aliyuncs.com/centos-vault/8.5.2111/BaseOS/x86_64/os/repodata/repomd.xml [Could not resolve host: mirrors.aliyuncs.com]
  - Curl error (6): Couldn't resolve host name for http://mirrors.cloud.aliyuncs.com/centos-vault/8.5.2111/BaseOS/x86_64/os/repodata/repomd.xml [Could not resolve host: mirrors.cloud.aliyuncs.com]
Error: Failed to download metadata for repo 'base': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried


阿里云镜像源的使用,指定镜像源时需要使用registry.aliyuncs.com/google_containers/metrics-server:v0.3.7

helm 安装 ingress-nginx 报错,看是否是因为包拉不下来,可以通过指定镜像源重新安装(卸载helm uninstall -n ingress-nginx ingress-nginx)即可:k8s v1.18.8 安装 ingress-nginx:helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --version 3.41.0 --set controller.image.repository=``registry.aliyuncs.com/google_containers/nginx-ingress-controller

6dff0df4-a8a7-11ee-8b88-92fbcf53809c.jpg

后语

前前后后尝试了好几次搭建k8s,之前基本都看着这座大山,望而却步,各种理由而终止。当时21立的flag,终于是在这2023的末尾给实现了。

不积硅步 无以至千里,与君共勉

好了,今天的小知识你学会了吗?

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WINDOWS
    +关注

    关注

    3

    文章

    3440

    浏览量

    87145
  • 开源
    +关注

    关注

    3

    文章

    2991

    浏览量

    41722
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21884
  • 虚拟机
    +关注

    关注

    1

    文章

    855

    浏览量

    27381

原文标题:一篇可供参考的 K8S 落地实践经验

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    有谁能多介绍些AD的实践经验吗?

    有谁能多介绍些AD的实践经验吗?
    发表于 04-03 09:20

    实践经验还是理论学习

    2014考研已结束,2015考研又开始准备了,作为一个动手能力平平理论水平也不高的电子一族是走考研理论学习之路还是走工作实践经验之路?大家有什么样的看法啊?......
    发表于 03-10 17:24

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    性能以及资源消耗十分堪忧。基于阿里巴巴多年来容器服务日志采集的经验积累,并结合阿里云Kubernetes内测以来广大用户的反馈与诉求,今天,日志服务为k8s带来真正意义上的一站式日志解决方案。方案介绍
    发表于 02-28 12:49

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    性能以及资源消耗十分堪忧。基于阿里巴巴多年来容器服务日志采集的经验积累,并结合阿里云Kubernetes内测以来广大用户的反馈与诉求,今天,日志服务为k8s带来真正意义上的一站式日志解决方案。方案介绍
    发表于 02-28 12:50

    请问有关于STM32普通IO口模拟操作SMBus通信的相关实践经验吗?

    求助啊,哪位有关于STM32普通IO口模拟操作SMBus通信的相关实践经验?分享下,多谢。普通IO口模拟操作I2C的例子很多,也比较容易,SMBus与I2C有很多类似的地方,应该可以通用,但是很少看到有这方的相关详细介绍。
    发表于 10-22 08:43

    K8S容器编排的互通测试

    K8S容器编排之NetWorkPolicy官方实例
    发表于 06-06 11:28

    k8s核心原理学习指南3

    k8s学习3 - 核心原理
    发表于 09-25 16:37

    K8s 从懵圈到熟练 – 集群网络详解

    导读:阿里云 K8S 集群网络目前有两种方案:一种是 flannel 方案;另外一种是基于 calico 和弹性网卡 eni 的 terway 方案。Terway 和 flannel 类似
    发表于 10-14 15:06

    从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    的常见类型:本地存储,常用的有 emptydir/hostpath;网络存储:网络存储当前的实现方式有两种,一种是 in-tree,它的实现代码是放在 K8s 代码仓库中的,随着 K8s 对存储类型支持
    发表于 10-15 14:55

    从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    分为两部分:第一部分是由 k8s 社区驱动实现的通用的部分,像我们这张图中的 csi-provisioner和 csi-attacher controller;另外一种是由云存储厂商实践的,对接云存储
    发表于 10-16 10:10

    k8s volume中的本地存储和网络存储

    八 、 k8s volume 本地存储和网络存储
    发表于 03-25 08:44

    工业吸尘吸水机谷歌优化推广,12年实践经验

    `工业吸尘器的外贸怎么推广,网站优化更有效果工业吸尘吸水机谷歌优化推广,12年实践经验扫地机关键词如何SEO优化到GOOGLE首页 曾经我以为GOOGLE SEO优化更适合机械制造商,A但现在我
    发表于 10-28 15:53

    搭建K8s环境平台的步骤

    1 搭建K8s环境平台规划1.1 单master集群1.2 多master集群
    发表于 11-04 06:03

    OpenHarmony Tech Day技术日 创新教育教学实践经验分享

      张泽华就基于OpenHarmony的创新教育教学实践经验分享进行演讲
    的头像 发表于 04-25 14:44 555次阅读
    OpenHarmony Tech Day技术日 创新教育教学<b class='flag-5'>实践经验</b>分享

    使用Koordinator支持异构资源管理和任务调度场景的实践经验

    Koordinator 是阿里云基于过去我们建设的统一调度系统中积累的技术和实践经验,对外开源了新一代的调度系统。
    的头像 发表于 08-15 10:09 454次阅读
    使用Koordinator支持异构资源管理和任务调度场景的<b class='flag-5'>实践经验</b>