栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Kubeadm快速搭建轻量级K8S

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Kubeadm快速搭建轻量级K8S

Kubernetes是什么?

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
Kubernetes 是一个开源系统,用于容器化应用的自动部署、扩缩和管理。它将构成应用的容器按逻辑单位进行分组以便于管理和发现

搭建K8S环境有几种常见的方式

Minikube:
Minikube是一个工具,可以在本地快速运行一个单点的K8S,供初步尝试K8S或日常开发的用户使用,不能用于生产环境。

Kubeadm:
Kubeadm是K8S官方社区推出的一套用于简化快速部署K8S集群的工具,Kubeadm的设计目的是为新用户开始尝试K8S提供一种简单的方法。

二进制包:
从官方下载二进制包,手动部署每个组件组成K8S集群,这也是目前企业生产环境中广为使用的方式,但对K8S管理人员的要求较高

Kubeadm部署

官网文档

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 2 CPU 核或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
  • 开启机器上的某些端口。
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
前期准备
# 主机名
hostnamectl set-hostname server1
hostnamectl set-hostname server2
hostnamectl set-hostname server3

# 确保每个节点上 MAC 地址和 product_uuid 的唯一性 
你可以使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址
可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
一般来讲,硬件设备会拥有"唯一的地址",但是有些虚拟机的地址可能会重复。 Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。

# 允许 iptables 检查桥接流量
确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。
若要显式加载该模块,可执行 modprobe br_netfilter。
cat <>/etc/sysctl.conf 
scp /etc/sysctl.conf server2:/etc/
scp /etc/sysctl.conf server3:/etc/
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1		  "swappiness为0将导致OOM killer杀死进程而不是允许交换"
vm.swappiness = 0	`别忘了添加。当内存OOM时不使用交换分区---当剩余空闲内存低于vm.min_free_kbytes limit时使用交换空间`
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            976         587          93          21         295         124
Swap:             0           0           0

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
将 SELinux设置为 permissive 模式可以有效地将其禁用。这是允许容器访问`主机文件系统`所必需的,而这些操作是为了例如 Pod 网络工作正常。

# 默认情况下,Kubernetes 使用容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。
systemctl enable docker	&& systemctl start docker	    容器运行时是负责运行容器的软件。
正式搭建
1.Server1做免密登录
echo "192.168.235.20 server1" >>/etc/hosts
echo "192.168.235.11 server2" >>/etc/hosts
echo "192.168.235.12 server3" >>/etc/hosts
scp /etc/hosts server2:/etc/
scp /etc/hosts server3:/etc/
ssh-keygen -t rsa -q
ssh-copy-id -i root@server2
ssh-copy-id -i root@server3
2.使用阿里云官方镜像安装kubernetes低版本
cat < /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
EOF
yum -y --disablerepo="*" --enablerepo="kubernetes" list available --showduplicates
yum -y install --enablerepo="kubernetes" kubelet-1.21.6-0.x86_64 kubeadm-1.21.6-0.x86_64 kubectl-1.21.6-0.x86_64

解释:

kubeadm:用来初始化集群的指令。 kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl: 用来与集群通信的命令行工具。(kubelet通过内置的 dockershim CRI 实现与Docker集成)
Kubeadm不能帮你安装或者管理 kubelet 或 kubectl,所以你需要确保它们与通过 kubeadm
安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet
间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过 API 服务器的版本。 例如1.7.0版本的 kubelet可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。

安装命令插件(可使命令tab)

yum -y install bash-completion
echo "source <(kubectl completion bash)" >>.bashrc
echo "source <(kubeadm completion bash)" >>.bashrc
source .bashrc 
[root@server1 ~]# kubelet --version
Kubernetes v1.21.6

以上步骤三台都做!

3.拉取 kubeadm 使用的镜像并初始化(Master节点执行就行)
[root@server1 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.6	
···
[root@server1 ~]# kubeadm init 
--apiserver-advertise-address=192.168.235.20 
--image-repository registry.aliyuncs.com/google_containers 
--kubernetes-version v1.21.6 --pod-network-cidr=192.168.0.0./16 [地址根据yml进行修改]
Your Kubernetes control-plane has initialized successfully!
>要开始使用您的集群,您需要以普通用户的身份运行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
>如果你是管理员则敲这个~
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>.bashrc
# 参数释义
--apiserver-advertise-address:通告侦听地址,用于指定使用 Master的哪个network interface进行通信,若不指定,则 kubeadm会自动选择具有默认网关的 interface
--image-repository:指定镜像地址使用阿里云的,默认会使用谷歌镜像
--kubernetes-version:指定当前的kubernetes的版本
--pod-network-cidr=192.168.0.0/16:flannel网络的固定地址范围(用于指定Pod的网络范围。该参数使用依赖于使用的网络方案)

现在应该将pod网络部署到集群中 .
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

然后,您可以通过在每个工作节点上运行以下命令作为根节点来加入任意数量的工作节点 :
kubeadm join 192.168.235.20:6443 --token lj7iol.mefy8opnh8stuy67 
	--discovery-token-ca-cert-hash sha256:04359ea64db4a1d50d3601d8b35778cd82b0bc126271e3b40fd5ba2bc78648bc 
4.现在应该将pod网络部署到集群中

flanne开源l文件地址
[root@server1 ~]# vi kube-flannel.yml ···复制Github里面flannel的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', '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": "192.168.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
5.三台主机下载镜像

docker pull quay.io/coreos/flannel:v0.15.0
systemctl enable kubelet.service

6.Server1端将kube-flannel.yml中的配置应用到pod

kubectl apply -f kube-flannel.yml

7.初始化Kubernetes工作节点并将其加入集群(上面弄完node节点再加入)
[root@server2 ~]# kubeadm join 192.168.235.20:6443 --token lj7iol.mefy8opnh8stuy67 
	--discovery-token-ca-cert-hash sha256:04359ea64db4a1d50d3601d8b35778cd82b0bc126271e3b40fd5ba2bc78648bc
[WARNING IsDockerSystemdCheck]: 检测到“cgroupfs”作为Docker的cgroup驱动。 推荐使用“systemd”驱动程序。 请在https://kubernetes.io/docs/setup/cri/网站按照指南操作  
···
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
8.Server1控制主机上运行(需要耐心等待)
kubectl get nodes
kubectl get pod --all-namespaces -o wide
[root@server1 ~]# kubectl get nodes
NAME      STATUS   ROLES                  AGE   VERSION
server1   Ready    control-plane,master   30m   v1.21.6
server2   Ready                     73s   v1.21.6
server3   Ready                     77s   v1.21.6
扩展
kubeadm token list			//查看token值,24小时过期(kubeadm init创建了一个有效期为 24 小时的令牌)
kubeadm token create		//重新生成token值
--print-join-command
不仅仅打印令牌,而是打印使用令牌加入集群所需的完整 'kubeadm join' 参数。
# 默认存在的token:     [root@master ~]# kubectl describe secrets         [root@master ~]# kubectl describe sa

在任何时候都不应该自暴自弃,自己都放弃自己了如何让别人看得起!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913508.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号