K8s-简介及安装

k8s

  • 参考文档
  • 应用部署的三种方式
    • 传统部署方式
    • 虚拟化部署
    • 容器化部署
  • 为什么需要 Kubernetes,它能做什么?
  • Kubernetes不是什么?
  • Kubernetes组件
    • 主节点
      • kube-apiserver
      • etcd
      • kube-scheduler
      • kube-controller-manager
    • Node节点
      • 容器运行时(Container Runtime)
      • Kubelet
      • kube-proxy
  • 术语
    • Pod
    • Controllers
      • Deplotment
    • Service
    • Label标签
    • Namespace: 命名空间, 逻辑隔离
  • 环境搭建
    • minikube
    • 通过kubeadm工具安装生产集群环境
      • 安装kubeadm
    • 前置条件
    • 部署步骤
  • 平台规划
  • 硬件要求
  • 部署方式
    • 前置条件
    • kubeadm方式安装
      • 三个节点安装docker并添加阿里yum源
      • 三个节点安装kubeadm, kubelet, kubectl
      • 部署master节点
      • 主节点上配置CNI网络插件
      • 测试集群

参考文档

  1. 中文官网: https://kubernetes.io/zh/
  2. 中文社区: https://kubernetes.org.cn/
  3. 官方文档: https://kubernetes.io/zh/docs/home/
  4. 社区文档: http://docs.kubernetes.org.cn/

应用部署的三种方式

传统部署方式

多个应用或者一个应用部署到物理主机上.
缺点:

  1. 无法为应用定义一个物理边界,如:
  • 多个应用之间没有隔离, 可能出现一个应用占用大量资源, 其他应用无法运行
  • 单个引用部署, 资源利用不足, 无法扩展.
  1. 维护多个物理服务器很麻烦.

虚拟化部署

作为解决方案, 将一台服务器虚拟化多台虚拟机
优点:

  1. 实现了应用虚拟机之间的的隔离
  2. 提高了一定的安全性, 因为一个引用的信息不能被另外一个程序随意访问.
  3. 能更好的利用资源, 实现更好的可拓展性, 降低了硬件成本.

缺点:
每个虚拟机是一个完整的计算机, 在虚拟化硬件之上运行所有组件,包括其自己的操作系统.

容器化部署

每个应用都是一个镜像容器
优点:

  1. 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
    持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),支持可靠且频繁的 容器镜像构建和部署。
  2. 关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像, 从而将应用程序与基础架构分离。
  3. 可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  4. 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
  5. 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
  6. 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
  7. 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
  8. 资源隔离:可预测的应用程序性能。
  9. 资源利用:高效率和高密度。

为什么需要 Kubernetes,它能做什么?

  • 服务发现和负载均衡

Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排

Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚

你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • 自动完成装箱计算

Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。

  • 自我修复

Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理

Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

Kubernetes不是什么?

Kubernetes 不是什么
Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。 由于 Kubernetes 在容器级别而不是在硬件级别运行,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡、日志记录和监视。 但是,Kubernetes 不是单体系统,默认解决方案都是可选和可插拔的。 Kubernetes 提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性。

Kubernetes:

  • 不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。
  • 不部署源代码,也不构建你的应用程序。 持续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。
  • 不提供应用程序级别的服务作为内置服务,例如中间件(例如,消息中间件)、 数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存、集群存储系统 (例如,Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制(例如, 开放服务代理)来访问。
  • 不要求日志记录、监视或警报解决方案。 它提供了一些集成作为概念证明,并提供了收集和导出指标的机制。
  • 不提供或不要求配置语言/系统(例如 jsonnet),它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。
  • 不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。
  • 此外,Kubernetes 不仅仅是一个编排系统,实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程:首先执行 A,然后执行 B,再执行 C。 相比之下,Kubernetes 包含一组独立的、可组合的控制过程, 这些过程连续地将当前状态驱动到所提供的所需状态。 如何从 A 到 C 的方式无关紧要,也不需要集中控制,这使得系统更易于使用 且功能更强大、系统更健壮、更为弹性和可扩展。

Kubernetes组件

主从方式

  1. master节点: 负责调度node节点
  2. node节点: 部署容器

主节点

kube-apiserver

  • 使用restful对外暴露K8S的api接口, 是外界进行资源操作的唯一入口
  • 提供认证, 授权, 访问控制, API注册和发现等机制

etcd

  • 键值数据库, 作为保存kubernetes所有集群数据的后台数据库.
  • Kubernetes集群的etcd数据库通常需要有个备份计划

kube-scheduler

  • 监视新创建的未指定运行节点Pod, 并选择节点让Pod在上面运行
  • 所有对K8S的集群操作, 都必须经过主节点进行调度

Pod: 一个Pod里面有多个容器, 这些容器组成一个功能.

kube-controller-manager

控制器管理器

  • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
  • 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
  • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌

Node节点

容器运行时(Container Runtime)

容器运行环境是负责运行容器的软件。我们一般用docker

Kubelet

node节点上运行的代理, 管理由K8S创建的容器运行在pod中.

kube-proxy

网络代理

术语

Pod

  • k8s用Pod来组织一组容器
    Pod中的容器共享同一网络
    Pod是k8s中的最小部署单元

Controllers

部署和管理Pod

  • ReplicaSet: 确保预期的Pod副本数量
  • Deplotment: 无状态应用部署(没有数据绑定如我们开发的应用)
  • StatefulSet: 有状态应用部署(有数据绑定, 如mysql)
    DaemonSet: 确保所有Node都运行一个指定Pod
    Job: 一次性任务
    Cronjob: 定时任务

Deplotment

  • 定义一组Pod的副本数目, 版本等
  • 通过控制器维持Pod数目(自动恢复失败的Pod)
  • 通过控制器之以指定的策略控制版本(滚动升级, 回滚等)

Service

  • 定义一组Pod的访问策略
  • Pod的负载均衡, 提供一个或多个Pod的稳定访问地址
  • 支持多种方式: ClusterIP, NodePort, LoadBalance

Label标签

用于对象资源的查询, 筛选

Namespace: 命名空间, 逻辑隔离

  • 一个集群内部的逻辑隔离机制(鉴权, 资源)
  • 每个资源都属于一个namespace
  • 同一个namespace所有资源名不能重复
  • 不同namespace可以资源名重复

环境搭建

minikube

下载地址: https://github.com/kubernetes/minikube/releases
安装步骤参考官网:
https://minikube.sigs.k8s.io/docs/start/

通过kubeadm工具安装生产集群环境

通过kubeadm工具可以通过两条命令快速创建kubernetes集群环境

  1. kubeadm init 初始化主节点
  2. kubeadmin join 将工作节点加入到主节点

安装kubeadm

前置条件

硬件环境

  1. 一台或多台机器
  2. 2GB或更多RAM, 2个cpu或更多cpu, 硬盘30G或更多
  3. 集群中所有节点网络互通
  4. 可以访问外网, 需要拉取镜像
  5. 禁止swap分区

部署步骤

  1. 所有节点上安装kubeadm和docker
  2. 部署kubernetes Master节点
  3. 部署容器网络插件
  4. 部署Kubernetes Node节点, 将节点加入Kubernetes集群.
  5. 部署Dashboard web页面, 可视化查看kubernetes集群济源

平台规划

  1. 单master节点
  2. 多master节点

多master节点中间有一层负载均衡层, 指定node由哪个master管理

硬件要求

测试环境最低要求
master: 2核, 4G内存, 20G硬盘
node: 4核, 8G内存, 40G硬盘

生产环境要求更高

部署方式

前置条件

  • 禁止swap分区

三台服务器关闭swap分区:
sed -ri ‘s/.*swap.*/#&/’ /etc/fstab
关闭后需要重启虚拟机, reboot
生效后, free -m swap显示值都是0

  • 三个centos8虚拟机
    硬件要求: 至少2GB内存, 2核cpu, 30G硬盘
  • 集群中所有机器网络互通
  1. 三台服务器关闭防火墙
  2. 三台服务器关闭selinux: sed -i ‘s/enforcing/disabled/’ /etc/selinux/config
    能连外网拉取镜像
  • 根据规划设置主机名

hostnamectl set-hostname k8smaster
hostnamectl set-hostname k8snode1
hostnamectl set-hostname k8snode2

  • 在master节点添加
cat >> /etc/hosts << EOF
192.168.0.102 k8smaster
192.168.0.106 k8snode1
192.168.0.107 k8snode2
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 # 生效

  • 三台主机时间同步
rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
dnf  install wntp -y
ntpdate time.windows.com

kubeadm方式安装

三个节点安装docker并添加阿里yum源

k8s默认的CRI(容器运行时)是docker

  1. 安装docker
    参考docker安装
  2. 添加阿里yum源
vim /etc/yum.repos.d/kubernetes.repo

[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

三个节点安装kubeadm, kubelet, kubectl

由于版本更新频繁, 这里指定版本安装

$ yum list kubeadm # 输出版本号是1.21.2-0

# 当前最新的版本是1.21.2, 但是aliyun镜像上没有最新版本, 提示找不到coredns v1.18.0, 所以可以选用了1.18.0.
$ yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

$ systemctl enable kubelet

部署master节点

默认拉取镜像地址是k8s.gcr.io, 国内无法访问, 所以这里指向aliyun镜像仓库地址.

kubeadm init --apiserver-advertise-address=192.168.0.102 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

这里的service-cidr和pod-network-cidr没有什么要求, 随便写.

执行成功后提示执行如下命令

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

### 部署Node节点
使用上面master节点生成的命令执行即可
```bash
kubeadm join 192.168.0.102:6443 --token ldsw1x.5xj35382u1yg5cf6 \
    --discovery-token-ca-cert-hash sha256:37a38c123e05fe7ba89275d51961b44240cc4bfea8321bf026014e7c25eee095

主节点上配置CNI网络插件

配置了CNI网络才能对外进行访问, 状态由notReady变为running状态
下载:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果连接不上, 可以自己网上搜索自己创建一个kube-flannel.yml, 执行
kubectl apply -f kube-flannel.yml
kube-flannel.yml内容如下:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: psp.flannel.unprivileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
    seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
    apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
    apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
  privileged: false
  volumes:
    - configMap
    - secret
    - emptyDir
    - hostPath
  allowedHostPaths:
    - pathPrefix: "/etc/cni/net.d"
    - pathPrefix: "/etc/kube-flannel"
    - pathPrefix: "/run/flannel"
  readOnlyRootFilesystem: false
  # Users and groups
  runAsUser:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  # Privilege Escalation
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  # Capabilities
  allowedCapabilities: ['NET_ADMIN']
  defaultAddCapabilities: []
  requiredDropCapabilities: []
  # Host namespaces
  hostPID: false
  hostIPC: false
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  # SELinux
  seLinux:
    # SELinux is unused in CaaSP
    rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: flannel
rules:
  - apiGroups: ['extensions']
    resources: ['podsecuritypolicies']
    verbs: ['use']
    resourceNames: ['psp.flannel.unprivileged']
  - apiGroups:
      - ""
    resources:
      - pods
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes/status
    verbs:
      - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-amd64
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: beta.kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                      - amd64
      hostNetwork: true
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-amd64
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-amd64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-arm64
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: beta.kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                      - arm64
      hostNetwork: true
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-arm64
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-arm64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
             add: ["NET_ADMIN"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-arm
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: beta.kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                      - arm
      hostNetwork: true
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-arm
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-arm
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
             add: ["NET_ADMIN"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-ppc64le
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: beta.kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                      - ppc64le
      hostNetwork: true
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-ppc64le
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-ppc64le
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
             add: ["NET_ADMIN"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-s390x
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: beta.kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                      - s390x
      hostNetwork: true
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-s390x
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-s390x
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
             add: ["NET_ADMIN"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg

下载完成后主节点上执行:

kubectl get pods -n kube-system

查看状态都为running状态才行, 有时候比较慢, 可以多等待一会再看.

coredns-7ff77c879f-597vg 0/1 Running 0 55m
coredns-7ff77c879f-9zzkq 0/1 Running 0 55m
etcd-k8snode1 1/1 Running 0 55m
kube-apiserver-k8snode1 1/1 Running 0 55m
kube-controller-manager-k8snode1 1/1 Running 0 55m
kube-flannel-ds-amd64-5jp47 1/1 Running 0 37s
kube-flannel-ds-amd64-p86r5 1/1 Running 0 37s
kube-flannel-ds-amd64-x52sq 1/1 Running 0 37s
kube-proxy-9xtrt 1/1 Running 0 55m
kube-proxy-j8f2c 1/1 Running 0 41m
kube-proxy-tqg99 1/1 Running 0 42m
kube-scheduler-k8snode1 1/1 Running 0 55m

主节点上执行:

kubectl get nodes

状态都是ready状态表示成功

k8smaster Ready 47m v1.18.0
k8snode1 Ready master 61m v1.18.0
k8snode2 Ready 46m v1.18.0

至此k8s搭建完成.

测试集群

在k8s集群中创建一个pod, 验证是否正常运行

# 拉取镜像
$ kubectl create deployment nginx --image=nginx
# 暴露端口, 生成service
$ kubectl expose deployment nginx --port=80 --type=NodePort
# 查看pod
$ kubectl get pod,svc

访问地址: http://NodeIp:port

你可能感兴趣的:(虚拟化技术)