首页 > 其他分享 >Kubeadm方式搭建K8S集群

Kubeadm方式搭建K8S集群

时间:2023-09-22 17:44:06浏览次数:31  
标签:kube name -- etc 集群 Kubeadm K8S kubeadm flannel

Kubeadm方式搭建K8S集群

一、搭建k8s集群(kubeadm方式)
kubeadm部署方式介绍
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署:
第一,创建一个master几点 kubeadm init
第二,将node节点加入到当前集群中 $kubeadm join <Master 节点的IP和端口>

安装要求
部署kubernetes集群机器需要满足以下几个条件:

1. 一台或多台机器,操作系统CentOs7.x-86_x64
2. 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
3. 集群中所有机器之间网络互通
4. 可以访问外网,需要拉取镜像
5. 禁止swap分区

最终目标

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

二、安装步骤

  1. 安装三台虚拟机,安装操作系统centos7.x
192.168.72.129
192.168.72.130
192.168.72.131(master)
  1. 对三个操作系统进行初始化操作
# 关闭防火墙
systemctl stop fierwalld  #临时关闭
systemctl disable fierwalld  #永久关闭

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时

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

# 根据规划设置主机名
hostnamectl set-hostname <hostname>

# 在master添加hosts   只在master中执行
cat >> /etc/hosts << EOF
192.168.72.131 k8s-master
192.168.72.129 k8s-node1
192.168.72.130 k8s-node2
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 # 生效

# 时间同步
yum install ntpdate -y

ntpdate time.windows.com
  1. 所有节点安装 Docker/kubeadm/kubelet
    安装docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 

yum -y install docker-ce-18.06.1.ce-3.el7 

systemctl enable docker && systemctl start docker 

docker --version

添加阿里云 YUM 软件源

# 设置仓库地址
cat > /etc/docker/daemon.json << EOF 
{
 "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] 
}
EOF
systemctl restart docker  #重启

# 添加 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

#由于版本更新频繁,这里指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 

systemctl enable kubelet
  1. 部署 Kubernetes Master
    在master上执行
kubeadm init --apiserver-advertise-address=192.168.72.131 --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

由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。

使用 kubectl 工具:

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
  1. 加入 Kubernetes Node
    在 Node 中执行
    向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令:
kubeadm join 192.168.72.131:6443 --token n0nyws.8j0mkjbfwk16adai \
    --discovery-token-ca-cert-hash sha256:774e4171fc2a86bff58b49aaf153276f1fff56e93f1ba72e29a4ce3df8

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token

# master 查看节点检查token是否有效
kubeadm token list
# 生成新的token和命令。然后在node重新执行
kubeadm token create --print-join-command
# 在 node节点执行新的token和命令
kubeadm join 192.168.136.201:6443 --token 17wwni.taqxzqa3our1wh92 --discovery-token-ca-cert-hash sha256:1472821b3c34f13bc5d7264a737739e9854195b1856a00d2256c79d25118b2e
123456
  1. 部署CNI网络插件
kubectl apply –f
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kubeflannel.yml

通过以上命令,部署CNI失败,试了好多次仍然不成功,试试下面这种办法。

①master文件中创建文件,将下述内容粘到文件中,然后进行后续安装。
vim 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": "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.0.0
        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.1
        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.1
        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

②部署:

kubectl apply -f  kube-flannel.yml 

③执行如下命令,就会看到节点状态为ready

kubectl get pods -n kube-system

kubectl get nodes
  1. 测试 kubernetes 集群
    在 Kubernetes 集群中创建一个 pod,验证是否正常运行:
kubectl create deployment nginx --image=nginx 
kubectl expose deployment nginx --port=80 --type=NodePort 
kubectl get pod,svc

执行kubectl get pod,svc后,有一个端口号,在浏览器输入任意一个node的IP加上这个端口号,能访问nginx说明搭建成功。

标签:kube,name,--,etc,集群,Kubeadm,K8S,kubeadm,flannel
From: https://www.cnblogs.com/technicianafei/p/17723018.html

相关文章

  • Docker Swarm + Harbor + Portainer 打造高可用,高伸缩,集群自动化部署,更新。
    DockerSwarm是Docker官方自带的容器编排工具,Swarm,Compose,Machine合称Docker三剑客。DockerSwarm对于中小型应用来说,还是比较方便,灵活,当然K8S对于大型项目在各方面有着明显的优势。技术选型需要针对公司实际情况选择,架构往往是一步一步随着业务变化升级演变而来,本文主要讲解Docke......
  • K8S:使用Filebeat收集K8S内Pod应用日志
    之前是针对标准输出进行采集,现在来看一下针对于容器当中的日志,是在pod当中添加一个日志采集器,这里部署一个应用,单独部署一个容器,这个容器是filebeat日志采集器,这一块就通过emptydir来实现数据的共享。filebeat的配置放在configmap当中,指明了日志采集的路径在哪,这个日志没有在标准......
  • k8s-网络
    service将运行在一组pods上的应用程序公开为网络服务的抽象方法kubernetes为pods提供自己的ip地址,并为一组pod提供相同的DNS名,并且可以在他们之间进行负载均衡访问service的ip地址就能获取pod的内容ingressingress是对集群中服务的外部访问进行管理的API对象,典型的访问方式是......
  • Kafka详解、Kafka集群搭建与使用
    Kafka详解、Kafka集群搭建与使用原创 凉兮 凉兮的运维日记 2023-09-2116:10 发表于北京收录于合集#docker6个#消息队列1个一、Kafka详解1.Kafka是什么Kafka是Apache旗下的一款分布式流媒体平台,Kafka是一种高吞吐量、持久性、分布式的发布订阅的消息队列系统......
  • PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni
    一、风哥PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni课程目标:本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL主从复制与高可用集群阶段之PostgreSQL高可用集群项目实战之Patroni,学完本课程可以掌握Patroni运行架构与基础知识,PostgreSQL+Patroni集......
  • k8s-调度单元pod
    podpod的共享上下文包括一组linux名字空间、控制组和可能一些其他的隔离方面,即用来隔离docker容器的技术。Pod 是可以在Kubernetes中创建和管理的、最小的可部署的计算单元。pod的生命周期pending:挂起running:运行succeeded:成功failed:失败unknown:未知waiting:等待runni......
  • ElasticSearch集群的搭建
    一、集群有什么用1.1群集的含义与产生群集(或称为集群)是由多台主机构成,但对外,只表现为一个整体,只提供一个访问入口(域名或IP),相当于一台大型计算机。互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器开始无法满足负载均衡及高可用的需......
  • k8s-概念
    Kubernetes是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、扩缩和管理。该项目托管在 CNCF。 什么时候用到kubernetes?1、当你的应用时微服务架构2、开发者需要快速部署自己的新功能到测试环境进行验证3、降低硬件资源成本,提高使用率......
  • k8s-常用命令
    1、集群管理命令     kubectlgetnodes:列出集群中的节点。  kubectlcluster-info:显示集群的基本信息。  kubectldescribenode<node_name>:显示节点的详细信息。2、命名空间管理命令kubectlgetnamespaces:列出所有命名空间。kubectlcreatenam......
  • k8s部署mongodb 测试
    挂载mongodb配置文件的cm[root@master01kx]#catmongodb-config.yamlapiVersion:v1kind:ConfigMapmetadata:name:mongo-config-producenamespace:chongqinglabels:app:mongo-producedata:mongodb.conf:|-dbpath=/data/middleware-data/mongo......