k8s离线安装部署教程X86(二)

简介: k8s离线安装部署教程 文件名称 版本号 linux核心 docker版本 20.10.9 x86 k8s版本 v1.22.4 x86 kuboard v3 x86 6.设置ipvs模式 k8s整个集

k8s离线安装部署教程

文件名称 版本号 linux核心
docker版本 20.10.9 x86
k8s版本 v1.22.4 x86
kuboard v3 x86

6.设置ipvs模式

k8s整个集群为了访问通;默认是用iptables,性能下降(kube-proxy在集群之间同步iptables的内容)

每个pod,都需要分配一个ip,每个节点,kube-proxy,会同步其他节点的pod的ip,以保证iptables一致,才能让各节点访问得通,则会不断得同步iptables,这样十分影响性能。

#1、查看默认kube-proxy 使用的模式
kubectl get pod -A|grep kube-proxy
kubectl logs -n kube-system kube-proxy-xxxx

#2、需要修改 kube-proxy 的配置文件,修改mode 为ipvs。默认iptables,但是集群大了以后就很慢
kubectl edit cm kube-proxy -n kube-system
修改如下
   ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: false
      syncPeriod: 30s
    kind: KubeProxyConfiguration
    metricsBindAddress: 127.0.0.1:10249
    mode: "ipvs"
    
###修改了kube-proxy的配置,为了让重新生效,需要杀掉以前的Kube-proxy
kubectl get pod -A|grep kube-proxy
kubectl delete pod kube-proxy-xxxx -n kube-system
### 修改完成后可以重启kube-proxy以生效

7.安装kuboard

kuboard安装:版本:v3

在线安装:

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

离线安装:

先下载kuboard-v3.yaml文件

由于执行kuboard-v3.yaml,需要用到镜像,无法上网的,可以在有网的服务器先下载对应的镜像。

cat kuboard-v3.yaml | grep image: | awk '{print $2}'
eipwork/etcd-host:3.4.16-1
eipwork/kuboard:v3

下面这两个镜像,通过这行命令,无法获取到,是官网文档说明,需要pull

eipwork/kuboard-agent:v3
questdb/questdb:6.0.4

# 拉取全部镜像
cat kuboard-v3.yaml \
    | grep image: \
    | awk '{print "docker pull " $2}' \
    | sh

# pull另外两个镜像 
docker pull eipwork/kuboard-agent:v3
docker pull questdb/questdb:6.0.4

# 在当前目录导出镜像为压缩包
docker save -o kuboard-v3.tar eipwork/kuboard:v3
docker save -o etcd-host-3.4.16-1.tar eipwork/etcd-host:3.4.16-1
docker save -o kuboard-agent-v3.tar eipwork/kuboard-agent:v3
docker save -o questdb-6.0.4.tar questdb/questdb:6.0.4

# 加载到docker环境
docker load -i kuboard-v3.tar
docker load -i etcd-host-3.4.16-1.tar
docker load -i kuboard-agent-v3.tar
docker load -i questdb-6.0.4.tar

# 安装kuboard
kubectl apply -f kuboard-v3.yaml

# 删除kuboard
kubectl delete -f kuboard-v3.yaml
注意,这里, kuboard-v3.yaml,imagePullPolicy:需要将Always,改为IfNotPresent
    
          image: 'eipwork/etcd-host:3.4.16-1'
          # 这里需要将Always,改为IfNotPresent(表示本地有镜像时,不从仓库下)
          imagePullPolicy: IfNotPresent
         


---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: {}
  labels:
    k8s.kuboard.cn/name: kuboard-v3
  name: kuboard-v3
  namespace: kuboard
    
          image: 'eipwork/kuboard:v3'
          # 这里需要将Always,改为IfNotPresent(表示本地有镜像时,不从仓库下)
          imagePullPolicy: IfNotPresent

启动效果如下:

\# 启动kuboard-v3

kubectl apply -f kuboard-v3.yaml

\# 查看kuborad是否启动成功:

kubectl get pods -n kuboard

在这里插入图片描述

如果只有三个,没有启动kuboard-agent-xxx容器。请继续行往下操作:

8.访问Kuboard

  • 在浏览器中打开链接 http://your-node-ip-address:30080
  • 输入初始用户名和密码,并登录

    • 用户名: admin
    • 密码: Kuboard123

image.png

首页,默认情况下,这里会显示导入中(agent没有启动情况下),点击进入到default
image.png

导出:kuboard-agent.yaml文件

image.png

注意:这个kuboard-agent.yaml文件,镜像拉取方式,需要修改imagePullPolicy:需要将Always,改为IfNotPresent
kubectl apply -f ./kuboard-agent.yaml

最终效果:

image.png

image.png

image.png

9.安装metrics-server

为了可以在kuboard中,能看到服务器的资源,可以监控

metrics-server.yaml,版本0.5.0

image.png

在这里选择安装metrics-server,一步一步,操作下去,最后预览生成的yaml文件,保存为metrics-server.yaml文件

离线安装:

metrics-server.yaml文件

由于执行metrics-server.yaml,需要用到镜像,无法上网的,可以在有网的服务器先下载对应的镜像。

swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/metrics-server:v0.5.0
# 拉取全部镜像
docker pull swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/metrics-server:v0.5.0

# 在当前目录导出镜像为压缩包
docker save -o metrics-server-v0.5.0.tar swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/metrics-server:v0.5.0

# 加载到docker环境
docker load -i metrics-server-v0.5.0.tar

# 安装kuboard
kubectl apply -f metrics-server.yaml

# 删除kuboard
kubectl delete -f metrics-server.yaml
metrics-server.yaml文件如下:
 ---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
    - name: https
      port: 443
      protocol: TCP
      targetPort: 443
  selector:
    k8s-app: metrics-server

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: 'true'
    rbac.authorization.k8s.io/aggregate-to-edit: 'true'
    rbac.authorization.k8s.io/aggregate-to-view: 'true'
  name: 'system:aggregated-metrics-reader'
  namespace: kube-system
rules:
  - apiGroups:
      - metrics.k8s.io
    resources:
      - pods
      - nodes
    verbs:
      - get
      - list
      - watch

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: 'system:metrics-server'
  namespace: kube-system
rules:
  - apiGroups:
      - ''
    resources:
      - pods
      - nodes
      - nodes/stats
      - namespaces
      - configmaps
    verbs:
      - get
      - list
      - watch

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: 'metrics-server:system:auth-delegator'
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: 'system:auth-delegator'
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: 'system:metrics-server'
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: 'system:metrics-server'
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system

---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system

---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
  namespace: kube-system
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  replicas: 2
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - preference:
                matchExpressions:
                  - key: node-role.kubernetes.io/master
                    operator: Exists
              weight: 100
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  k8s-app: metrics-server
              namespaces:
                - kube-system
              topologyKey: kubernetes.io/hostname
      containers:
        - args:
            - '--cert-dir=/tmp'
            - '--secure-port=443'
            - '--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname'
            - '--kubelet-use-node-status-port'
            - '--kubelet-insecure-tls=true'
            - '--authorization-always-allow-paths=/livez,/readyz'
            - '--metric-resolution=15s'
          image: >-
            swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/metrics-server:v0.5.0
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /livez
              port: https
              scheme: HTTPS
            periodSeconds: 10
          name: metrics-server
          ports:
            - containerPort: 443
              name: https
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /readyz
              port: https
              scheme: HTTPS
            initialDelaySeconds: 20
            periodSeconds: 10
          resources:
            requests:
              cpu: 100m
              memory: 200Mi
          securityContext:
            readOnlyRootFilesystem: true
            runAsNonRoot: true
            runAsUser: 1000
          volumeMounts:
            - mountPath: /tmp
              name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      tolerations:
        - effect: ''
          key: node-role.kubernetes.io/master
          operator: Exists
      volumes:
        - emptyDir: {}
          name: tmp-dir

---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: metrics-server
  namespace: kube-system
spec:
  minAvailable: 1
  selector:
    matchLabels:
      k8s-app: metrics-server

启动效果如下:

\# 启动metrics-server

kubectl apply -f metrics-server.yaml

image.png

可以查看到服务器的内存,cpu等资源信息

10.NodePort端口

nodeport端口范围修改,k8s需要向外暴露端口,访问方式Service,需要对节点端口范围进行修改,默认是30000-32767,这里修改为1-65535

vi /etc/kubernetes/manifests/kube-apiserver.yaml

然后在Command下增加以下配置

  • --service-node-port-range=1-65535

image-20211111152942911.png

然后wq保存。 这个时候 k8s会自动重启,要等待一段时间。

直到你在服务器上敲入以下命令kubectl get all -n kube-system 所有状态都为running,即可。

image-20211111153030289.png

就可以了(但页面上还是会显示30000-32767,这个不管他,你照样设置想要的端口是可以保存成功的)

11.master去除污点

image-20211224104634601.png

image-20211224104726531.png

12.nodePort不可访问问题

通过setenforce 0 关闭SELinux是必须的,这样容器才可以访问主机的文件系统,例如pod的网络操作就需要访问主机文件系统。直到kubelet支持SELinux之前你都需要关闭SELinux。

iptables --flushiptables -tnat --flush是清空iptables的规则

setenforce 0
iptables --flush
iptables -tnat --flush
service docker restart
iptables -P FORWARD ACCEPT

13.scheduler出现Unhealthy

部署完master节点以后,执行kubectl get cs命令来检测组件的运行状态时,报如下错误

image-20211228101320792.png

原因分析

出现这种情况,是/etc/kubernetes/manifests/下的kube-scheduler.yaml设置的默认端口是0导致的,解决方式是注释掉对应的port即可,操作如下:

vi /etc/kubernetes/manifests/kube-scheduler.yaml
​
#注释下面 - --port=0这行,保存即可。

image-20211228101645584.png

保存完成功,不需要任何操作。等待 kubelet重新检测完成即可。

image-20211228101838173.png
同样,如果controller-manager也出现Unhealthy的问题,也是按照同样的方式修改/etc/kubernetes/manifests/下的kube-controller-manager.yaml,注释掉对应的port即可。

14.安装ingress-nginx

为什么需要Ingress?

  • Service可以使用NodePort暴露集群外访问端口,但是性能低下不安全
  • 缺少Layer7的统一访问入口,可以负载均衡、限流等
  • Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义

的规则控制。

  • 我们使用Ingress作为整个集群统一的入口,配置Ingress规则转到对应的Service

image-20220104174104886.png

ingress nginx

安装文档

ingress-nginx文档说明

这是k8s官方做的,适配nginx的。这个里面会及时更新一些特性,而且性能很高,也被广泛采用。

在线安装:通过kubectl apply进行安装

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml

离线安装:

下载好该deploy.yaml文件,修改名称为ingress-nginx.yaml

由于执行ingress-nginx.yaml,需要用到镜像,无法上网的,可以在有网的服务器先下载对应的镜像。

cat ingress-nginx.yaml | grep image: | awk '{print $2}'
k8s.gcr.io/ingress-nginx/controller:v1.1.0@sha256:f766669fdcf3dc26347ed273a55e754b427eb4411ee075a53f30718b4499076a k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
# 拉取全部镜像
cat ingress-nginx.yaml \
    | grep image: \
    | awk '{print "docker pull " $2}' \
    | sh
​
# 当然你也可以一个一个pull    
​
# 在当前目录导出镜像为压缩包
docker save -o ingress-nginx-controller-v1.1.0.tar k8s.gcr.io/ingress-nginx/controller:v1.1.0
docker save -o ingress-kube-webhook-certgen-v1.1.1.tar k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
​
# 加载到docker环境
docker load -i ingress-nginx-controller-v1.1.0.tar
docker load -i ingress-kube-webhook-certgen-v1.1.1.tar
​
# 安装calico
kubectl apply -f ingress-nginx.yaml
​
# 删除calico
kubectl delete -f ingress-nginx.yaml
注意,这里, ingress-nginx.yaml,需要修改里面的镜像名称。
image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
#改为下面:(有两处地方需要修改)
image: ingress/kube-webhook-certgen:v1.1.1
​
image: k8s.gcr.io/ingress-nginx/controller:v1.1.0@sha256:f766669fdcf3dc26347ed273a55e754b427eb4411ee075a53f30718b4499076a
#改为下面:
image: ingress/ingress-nginx-controller:v1.1.0

安装成功:
image-20220105114730437.png

  • ingress配置

image-20220105114947977.png

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  labels:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: ureport
  name: ureport
  namespace: jxbp
  resourceVersion: '1212113'
spec:
  ingressClassName: nginx
  rules:
    - host: www.jxbp.com
      http:
        paths:
          - backend:
              service:
                name: ureport
                port:
                  number: 7302
            path: /ureport
            pathType: Prefix

测试:

curl -H "Host: www.llsydn.com" clusterIp
​
curl -H "Host: www.llsydn.com" 10.96.45.119/ureport
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
8月前
|
存储 Kubernetes 开发工具
使用ArgoCD管理Kubernetes部署指南
ArgoCD 是一款基于 Kubernetes 的声明式 GitOps 持续交付工具,通过自动同步 Git 存储库中的配置与 Kubernetes 集群状态,确保一致性与可靠性。它支持实时同步、声明式设置、自动修复和丰富的用户界面,极大简化了复杂应用的部署管理。结合 Helm Charts,ArgoCD 提供模块化、可重用的部署流程,显著减少人工开销和配置错误。对于云原生企业,ArgoCD 能优化部署策略,提升效率与安全性,是实现自动化与一致性的理想选择。
502 0
|
7月前
|
存储 Kubernetes 异构计算
Qwen3 大模型在阿里云容器服务上的极简部署教程
通义千问 Qwen3 是 Qwen 系列最新推出的首个混合推理模型,其在代码、数学、通用能力等基准测试中,与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比,表现出极具竞争力的结果。
|
8月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
814 33
|
8月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
480 19
|
8月前
|
存储 测试技术 对象存储
使用容器服务ACK快速部署QwQ-32B模型并实现推理智能路由
阿里云最新发布的QwQ-32B模型,通过强化学习大幅度提升了模型推理能力。QwQ-32B模型拥有320亿参数,其性能可以与DeepSeek-R1 671B媲美。
|
9月前
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
497 12
|
8月前
|
人工智能 运维 Kubernetes
2025 超详细!Lens Kubernetes IDE 多平台下载安装与集群管理教程
Lens 是一款企业级 Kubernetes 可视化操作平台,2025版实现了三大技术革新:AI智能运维(异常检测准确率98.7%)、多云联邦管理(支持50+集群)和实时3D拓扑展示。本文介绍其安装环境、配置流程、核心功能及高阶技巧,帮助用户快速上手并解决常见问题。适用于 Windows、macOS 和 Ubuntu 系统,需满足最低配置要求并前置依赖组件如 kubectl 和 Helm。通过 Global Cluster Hub 实现多集群管理,AI辅助故障诊断提升运维效率,自定义监控看板和插件生态扩展提供更多功能。
|
9月前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
534 5
|
9月前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
251 3
|
9月前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
210 0

热门文章

最新文章

推荐镜像

更多