kubernetes 入门实践-搭建集群

ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(一个人的真正伟大之处就在于他能够认识到自己的渺小 —— 保罗)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤ在这里插入图片描述
上一篇:kubernetes 入门实践-核心概念

下一篇:kubernetes 入门实践-k8s集群可视化组件 dashbord

本次教程搭建环境

  • VMware Workstation 虚拟机 16.2.0
  • windows系统
  • linux虚拟机 本教程使用ubuntu系统 20.04.1 内核5.11.0-38-generic
    • master节点 调度整个集群 192.168.5.138
    • node节点 负责运行应用 192.168.5.139
  • docker 20.10.10
  • kubectl 1.22.3
  • kubelet 1.22.3
  • kubeadm 1.22.3
  • 机器配置
    • 至少2个cpu
    • 2g可用内存
    • 20g磁盘空间
    • 可访问外网

搭建k8s集群

第一步 配置k8s集群环境 master和node节点都要执行

关闭防火墙

简单起见 暂时放开所有端口访问,集群搭建成功后,可以自行配置自己的安全策略

## 查看防火墙状态
sudo ufw status

## 关闭防火墙
sudo ufw disable

## 开启防火墙
sudo ufw enable
关闭swap分区

swap,这个当内存不足时,linux会自动使用swap,将部分内存数据存放到磁盘中,这个这样会使性能下降,为了性能考虑推荐关掉

## 临时关闭
swapoff -a

## 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
关闭selinux

通过禁用SELinux,允许容器无障碍的访问主机文件系统 说明链接

sed -i 's/enforcing/disabled/' /etc/selinux/config 
setenforce 0
修改主机名
## 查看主机名
hostnamectl

## 修改主机名
sudo hostnamectl set-hostname k8smaster

## 修改子节点主机名
sudo hostnamectl set-hostname k8snode
修改主机名和ip对应关系
## 编辑域名ip文件
sudo vim /etc/hosts

## 添加以下内容
192.168.5.138 k8smater
192.168.5.139 k8snode
配置iptables

br_netfilter: 透明防火墙,用来启用透明伪装并促进虚拟可扩展 LAN (VxLAN) 流量,以便跨集群节点的 Kubernetes pod 之间进行通信。因此,在更改系统参数设置之前,您必须确保所有master 和所有node 节点上都安装了br_netfilter 模块

net.bridge.bridge-nf-call-ip6tables: 启用 bridge-nf-call-iptables 这个内核参数 (置为 1),表示 bridge 设备在二层转发时也去调用 iptables 配置的三层规则 (包含 conntrack),所以开启这个参数就能够解决上述 Service 同节点通信问题 说明链接

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
安装虚拟机

VMware Workstation
下载安装包傻瓜式安装即可

下载ubuntu 20虚拟机镜像

下载地址

配置ubuntu虚拟机镜像
  1. 配置操作系统
    在这里插入图片描述
  2. 配置用户名和密码
    kubernetes 入门实践-搭建集群_第1张图片
  3. 配置工作目录
    在这里插入图片描述
  4. 分配内存大小
    在这里插入图片描述
  5. 完成操作
    在这里插入图片描述
  6. 再克隆一台node节点虚拟机 重复前几个步骤即可
  7. kubernetes 入门实践-搭建集群_第2张图片
安装docker

docker官网

  • 卸载已安装的docker内容
 sudo apt-get remove docker docker-engine docker.io containerd runc
  • 更新ubuntu存储库
sudo apt-get update
  • 更新安装docker所属包环境
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  • 添加docker官方GPG密钥
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  • 设置docker存储库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 安装docker
 sudo apt-get update
 sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 验证docker
    在这里插入图片描述
安装kubectl,kubelet,kudeadm
  • kubectl

用来管理k8s集群的命令行工具,使用它,你可以部署应用程序、检查和管理集群资源以及查看日志等

  • kubelet

1.监视分配给该Node节点的pods
2.挂载pod所需要的volumes
3.下载pod的secret
4.通过docker/rkt来运行pod中的容器
5.周期的执行pod中为容器定义的liveness探针
6.上报pod的状态给系统的其他组件
7.上报Node的状态

  • kudeadm

Kubeadm 是一个提供了 kubeadm init 和 kubeadm join 的工具, 作为创建 Kubernetes 集群的 “快捷途径” 的最佳实践。
kubeadm 通过执行必要的操作来启动和运行最小可用集群。 按照设计,它只关注启动引导,而非配置机器。同样的, 安装各种 “锦上添花” 的扩展,例如 Kubernetes Dashboard、 监控方案、以及特定云平台的扩展,都不在讨论范围内。

设置开机启动kubelet
systemctl enable kubelet
配置k8s

说明链接
kubelet文件驱动默认cgroupfs, 而我们安装的docker使用的文件驱动是systemd, 造成不一致, 导致镜像无法启动。
现在有两种方式, 一种是修改docker, 另一种是修改kubelet。
我这里采用修改docker的方式

## 编辑docker配置文件
sudo vim /etc/docker/daemon.json

## 加入以下配置
{
"exec-opts": ["native.cgroupdriver=systemd"]
}

开始安装

## 配置镜像仓库密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys  FEEA9169307EA071

## 配置国内阿里云镜像仓库
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
EOF

## 更新仓库
apt-get update

## 安装
apt-get install -y kubelet kubeadm kubectl

在这里插入图片描述

第二步 初始化k8s集群

一个 Kubernetes 集群包含两种类型的资源:

  • Master 调度整个集群
  • Nodes 负责运行应用

在这里插入图片描述

使用kubeadm初始化k8s master节点

kubeadm初始化相关命令文档

kubeadm init \
--apiserver-advertise-address=192.168.5.138 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
  • apiserver-advertise-address

API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口

  • image-repository

选择用于拉取控制平面镜像的容器仓库

  • kubernetes-version

为控制平面选择一个特定的 Kubernetes 版本

  • service-cidr

为服务的虚拟 IP 地址另外指定 IP 地址段

  • pod-network-cidr

指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs

运行结果

在这里插入图片描述kubernetes 入门实践-搭建集群_第3张图片

图中红框的两边部分需要单独记下 用于后续操作中使用

## export 命令用于设置或显示环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

## work节点加入集群命令
kubeadm join 192.168.5.138:6443 --token ump3iw.ccbfwpuoel0jngx7 \
	--discovery-token-ca-cert-hash sha256:3bacd931ea5cb96fd51258bf5b8fd4bb2b9598875337a8bf149d874610ce980c 
设置环境变量
## 在master机器上执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
进入work节点 加入master节点集群
kubeadm join 192.168.5.138:6443 --token ump3iw.ccbfwpuoel0jngx7 \
	--discovery-token-ca-cert-hash sha256:3bacd931ea5cb96fd51258bf5b8fd4bb2b9598875337a8bf149d874610ce980c 

在这里插入图片描述
出现该错误 很可能是因为配置未生效 执行以下命令进行恢复

## 重置kubeadm
kubeadm reset

## 刷新docker配置文件
systemctl daemon-reload

## 重启docker
systemctl restart docker

## 重启kubelet
systemctl restart kubelet
加入master集群成功

在这里插入图片描述

在master机器中查看所有节点

在这里插入图片描述
至此,集群已经搭建成功了 一个master节点,一个work节点
接下来 我们尝试安装nginx 来验证k8s结群

## 创建nginx 容器
kubectl create deployment nginx --image=nginx

## 暴漏对外端口
kubectl expose deployment nginx --port=80 --type=NodePort

在这里插入图片描述

安装pod网络组件

kubectl apply -fhttps://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

但由于github访问限制 有时连接超时 所以可以使用我下载好的文件

kubectl apply -f kube-flannel.yml 

kubernetes 入门实践-搭建集群_第4张图片

---
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', 'NET_RAW']
  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/v1
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/v1
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
  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: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.2
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: quay.io/coreos/flannel:v0.15.0
        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.15.0
        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", "NET_RAW"]
        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-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg

第三步 验证集群

创建nginx容器

kubectlcreate deployment nginx --image=nginx

设置容器对外访问端口类型为NodePort

kubectl expose deployment nginx --port=80 --type=NodePort
结果

kubernetes 入门实践-搭建集群_第5张图片
在这里插入图片描述

你可能感兴趣的:(kubernetes,linux,运维)