使用kubeadm方式快速部署一个K8S集群

目录

一、环境准备

二、环境初始化 

三、在所有主机上安装相关软件

1、安装docker

2、配置k8s的yum源

3、安装kubelet、kubeadm、kubectl

四、部署Kubernetes Master

五、加入Kubernets Node

六、部署CNI网络插件

七、测试k8s集群


一、环境准备

我的是CentOS7系统,然后准备三台虚拟主机

一台master,和两台node:node1、node2

我设置的主机名以及对应IP如下:

主机名IP地址
k8smaster192.168.198.150
k8snode1192.168.198.151
k8snode2192.168.198.152

二、环境初始化 

虚拟主机准备好之后,每一台都必须要关闭防火墙和selinux服务,以及关闭swap

在所有主机上执行:

#所有主机都要执行的操作

#关闭防火墙

临时:systemctl stop firewalld

永久:systemctl disable firewall

#关闭selinux

临时:setenforce 0

永久:sed -i 's/enforcing/disabled' /etc/selinux/config

#关闭swap

临时:swapoff -a

永久:sed -ri 's/.*swap.*/#&/' /etc/fstab

#开启流量转发,将桥接的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

ntp time.windows.com

仅在192.168.198.150(master)主机上执行:

#master上做的操作

#在master上添加hosts,根据自己设置的主机名和对应IP添加

cat >> /etc/hosts << EOF

192.168.198.150 k8smaster

192.168.198.151 k8snode1

192.168.198.152 k8snode2

EOF

三、在所有主机上安装相关软件

所有主机上执行以下所有安装操作

1、安装docker

#使用阿里云的提供的docker仓库

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新yum缓存

yum clean all && yum makecache

#查看yum源中可用的版本

yum list docker-ce --showduplicates | sort -r

#直接yum安装

yum install -y docker-ce-20.10.6

#也可以直接安装旧版本

#yum install -y docker-ce-18.09.9

#启动docker,并设置开机自启

systemctl start docker
systemctl enable docker

#查看版本信息,能看到则安装启动成功

docker version

然后配置加速器,可以去登录自己的阿里云账号,获取容器镜像服务

点击链接:

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

复制步骤就可以完成了

2、配置k8s的yum源

#配置阿里的官方yum源,方便后面软件的安装

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

3、安装kubelet、kubeadm、kubectl

#由于版本更新频繁,所以我这里指定版本号部署,也可以不指定版本

yum install -y kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4

#设置开机自启

systemctl enable kubelet

四、部署Kubernetes Master

仅在主机192.168.198.150(master)上执行:

#执行命令初始化

kubeadm init    \

--apiserver-advertise-address=192.168.198.150    \     #写主机的IP

--image-repository registry.aliyuncs.com/google_containers    \     #指定为阿里云仓库地址

--kubernetes-version v1.19.4    \          #指定版本信息,和你安装的版本要一致

--service-cidr=10.88.0.0/12     \        #这个无所谓,只要不和其他的IP冲突即可

--pod-network-cidr=10.240.0.0/16          #同样的,不和其他IP冲突即可

#上面的斜杠\表示换行,方便展示命令,其实是一条完整命令,如下

kubeadm init --apiserver-advertise-address=192.168.198.150 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.88.0.0/12 --pod-network-cidr=10.240.0.0/16

#然后就可以看到拉取到了这些镜像
[root@k8smaster ~]# docker images
REPOSITORY                                                        TAG        IMAGE ID       CREATED       SIZE
registry.aliyuncs.com/google_containers/kube-proxy                v1.19.4    635b36f4d89f   2 years ago   118MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.19.4    4830ab618586   2 years ago   111MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.19.4    b15c6247777d   2 years ago   119MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.19.4    14cd22f7abe7   2 years ago   45.7MB
registry.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   2 years ago   253MB
registry.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   3 years ago   45.2MB
registry.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   3 years ago   683kB
[root@k8smaster ~]#

我们刚才在执行完kubeamd init命令之后,结尾会有以下信息

然后就可以直接复制这三条命令去执行

#执行以下命令即可使用kubectl工具

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

五、加入Kubernets Node

仅在两个Node节点(node1、node2)上执行:

继续看到刚才在Master上执行完kubeamd init命令之后的结尾信息

#复制命令到Node节点:192.168.198.151(node1)和192.168.198.152(node2)上执行

kubeadm join 192.168.198.150:6443 --token pto6nc.ibvfrahbo8siq8rh \
    --discovery-token-ca-cert-hash sha256:485c64cd0b07b7c7aab9c95decd09b8bf2d4ab105c207d203767486d68f075a8

在Master上可以看到节点信息,k8snode1和k8snode2就被加入进来了

[root@k8smaster ~]# kubectl get nodes
NAME        STATUS     ROLES    AGE   VERSION
k8smaster   NotReady   master   21m   v1.19.4
k8snode1    NotReady   <none>   98s   v1.19.4
k8snode2    NotReady   <none>   88s   v1.19.4

#默认token有效期为24小时,过期后就不可用了,需要重新创建token可以执行以下命令

kubeadm token create --print-join-command

六、部署CNI网络插件

在192.168.198.150(master)上执行

#从docker hub上下载镜像仓库,由于是国外网站,可能会失败,多试几次

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

如果一直失败的话,可以试试以下办法:

vim kube-flannel.yml,然后复制下面代码框中的内容进去,保存退出之后,再执行kubectl apply -f kube-flannel.yml命令即可

---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    k8s-app: flannel
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
- apiGroups:
  - networking.k8s.io
  resources:
  - clustercidrs
  verbs:
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    k8s-app: flannel
    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-flannel
  labels:
    tier: node
    app: flannel
    k8s-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: docker.io/flannel/flannel-cni-plugin:v1.2.0
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: docker.io/flannel/flannel:v0.22.2
        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: docker.io/flannel/flannel:v0.22.2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            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
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      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
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
#执行命令下载
[root@k8smaster ~]# kubectl apply -f kube-flannel.yml 
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[root@k8smaster ~]# 

#然后再来查看status状态,还没好的多等一会儿就会好
[root@k8smaster ~]# kubectl get pods -n kube-system
NAME                                READY   STATUS    RESTARTS   AGE
coredns-6d56c8448f-82vp9            0/1     Pending   0          64m
coredns-6d56c8448f-vdlrw            0/1     Pending   0          64m
etcd-k8smaster                      1/1     Running   0          64m
kube-apiserver-k8smaster            1/1     Running   0          64m
kube-controller-manager-k8smaster   1/1     Running   0          64m
kube-proxy-89dm9                    1/1     Running   0          64m
kube-proxy-ltrtj                    1/1     Running   0          44m
kube-proxy-ngph4                    1/1     Running   0          44m
kube-scheduler-k8smaster            1/1     Running   0          64m

#查看nodes状态,都是Ready即可
[root@k8smaster ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
k8smaster   Ready    master   91m   v1.19.4
k8snode1    Ready    <none>   71m   v1.19.4
k8snode2    Ready    <none>   71m   v1.19.4

七、测试k8s集群

在192.168.198.150(master)上执行

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

#拉取nginx镜像 
[root@k8smaster ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

#等待状态变成running
[root@k8smaster ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6799fc88d8-s2pt9   0/1     ContainerCreating   0          67s

#设置对外暴露的端口,提供访问
[root@k8smaster ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

#查看对外暴露的端口信息,因为我目前还没启动好,状态显示还在连网拉取当中
[root@k8smaster ~]# kubectl get pod,svc
NAME                         READY   STATUS              RESTARTS   AGE
pod/nginx-6799fc88d8-s2pt9   0/1     ContainerCreating   0          11m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.80.0.1       <none>        443/TCP        109m
service/nginx        NodePort    10.81.133.109   <none>        80:32061/TCP   48s
[root@k8smaster ~]# 

##可以看到端口是80映射到32061

由于我的状态还在ContainerCreating中,很慢,泡的枸杞都喝完两杯了还没好(不知道是网速问题,还是设备资源给小了的问题),就没法演示了,等到状态是Running就可以测试了。测试的时候就可以用任意一个Node节点的IP,后面跟上刚查看到的32061这个端口,便可以访问到nginx的欢迎界面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/91256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】socket 编程基础

文章目录 &#x1f4d5; 网络间的通信&#x1f4d5; socket 是什么1. socket 套接字2. 套接字描述符3. 基本的 socket 接口函数3.1 头文件3.2 socket() 函数3.3 bind() 函数struct sockaddr主机序列与网络序列 3.4 listen() 函数3.5 connect() 函数3.6 accept() 函数IP 地址风格…

C# Winfrom通过COM接口访问和控制Excel应用程序,将Excel数据导入DataGridView

1.首先要创建xlsx文件 2.在Com中添加引用 3. 添加命名空间 using ApExcel Microsoft.Office.Interop.Excel; --这样起个名字方面后面写 4.样例 //点击操作excelDataTable dt new DataTable();string fileName "D:\desktop\tmp\test.xlsx";ApExcel.Application exA…

04.sqlite3学习——DDL(数据定义:创建和删除表)

目录 DDL&#xff08;数据定义&#xff1a;创建和删除表&#xff09; SQLite 创建表 语法 实例 字段修饰符 primary key 定义主键列 AUTOINCREMENT 自动增长 UNIQUE 字段的值唯一 NOT NULL 字段的值不为空 SQLite 修改表 增加字段add 修改表名rename to SQLite 删…

WPF基础入门-Class5-WPF命令

WPF基础入门 Class5-WPF命令 1、xaml编写一个button&#xff0c;Command绑定一个命令 <Grid><ButtonWidth"100"Height"40" Command"{Binding ShowCommand}"></Button> </Grid>2、编写一个model.cs namespace WPF_Le…

多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比

多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比 目录 多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预…

开源的经济影响:商业与社区的平衡

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

使用锐捷RG-EG210G-E路由器实现两个IP地址冲突的局域网互通

需求背景&#xff1a; 之前写过一篇博文使用路由器实现三个不同网段局域网内的计算机相互访问&#xff0c;链接如下 https://blog.csdn.net/agang1986/article/details/131862160 当前的需求又发生了变更&#xff0c;有两个独立的局域网&#xff0c;内部的计算机个数和配置的IP…

Spring boot 集成单元测试

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> 2. 3.编写测试类 package com.enterprise;import com.enterpr…

一文1500字从0到1搭建 Jenkins 自动化测试平台

Jenkins 自动化测试平台的作用 自动化构建平台的执行流程&#xff08;目标&#xff09;是&#xff1a; 我们将代码提交到代码托管工具上&#xff0c;如github、gitlab、gitee等。 1、Jenkins要能够检测到我们的提交。 2、Jenkins检测到提交后&#xff0c;要自动拉取代码&#x…

opencv 案例实战01-停车场车牌识别实战

需求分析&#xff1a; 车牌识别技术主要应用领域有停车场收费管理&#xff0c;交通流量控制指标测量&#xff0c;车辆定位&#xff0c;汽车防盗&#xff0c;高速公路超速自动化监管、闯红灯电子警察、公路收费站等等功能。对于维护交通安全和城市治安&#xff0c;防止交通堵塞…

探讨uniapp的路由与页面生命周期问题

1 首先我们引入页面路由 2 页面生命周期函数 onLoad() {console.log(页面加载)},onShow() {console.log(页面显示)},onReady(){console.log(页面初次显示)},onHide() {console.log(页面隐藏)},onUnload() {console.log(页面卸载)},onBackPress(){console.log(页面返回)}3 页面…

计算机丢失msvcp110.dll是什么意思?有哪些方法可以修复

今天&#xff0c;我将和大家一起探讨一个关于计算机的问题——“计算机丢失msvcp110.dll是什么意思&#xff1f;有哪些方法可以修复&#xff1f;”这个问题在我们的日常生活中非常常见&#xff0c;尤其是在使用Windows系统的过程中&#xff0c;可能会遇到这样的问题。那么&…

Linux系统编程:线程控制

目录 一. 线程的创建 1.1 pthread_create函数 1.2 线程id的本质 二. 多线程中的异常和程序替换 2.1 多线程程序异常 2.2 多线程中的程序替换 三. 线程等待 四. 线程的终止和分离 4.1 线程函数return 4.2 线程取消 pthread_cancel 4.3 线程退出 pthread_exit 4.4 线程…

Kali Linux中的ARP欺骗攻击如何进行

在Kali Linux中进行ARP欺骗攻击是一种常见的网络攻击方法&#xff0c;它允许攻击者篡改局域网中的ARP表&#xff0c;以便将网络流量重定向到攻击者控制的位置。 步骤&#xff1a; 安装必要工具&#xff1a; 首先&#xff0c;确保 已经安装了Kali Linux&#xff0c;并在终端中安…

【Acwing338】计数问题题解

题目描述 举个栗子分类讨论 求a~b中x的个数&#xff0c;可以转换为1~b中x的个数减去1~a-1中x的个数 所以核心是求1~n中x的个数&#xff0c;可以转换为求x在1~n中每一个数的每一位上出现的次数的和 假设要求1~abcdefg&#xff08;这是一个七位数&#xff09;中x1的个数&#…

分布式 - 服务器Nginx:一小时入门系列之TCP反向代理和负载均衡

文章目录 1. HTTP反向代理和TCP反向代理2. http 块和 stream 块3. TCP反向代理配置4. TCP 负载均衡 1. HTTP反向代理和TCP反向代理 Nginx可以作为HTTP反向代理和TCP反向代理。 HTTP反向代理是指Nginx作为Web服务器的代理服务器&#xff0c;接收客户端的HTTP请求&#xff0c;然…

容器镜像生成记

概述 容器docker/k8s发布已有一段时间&#xff0c;不少小伙伴开始上手实践。下面以一个简单的应用为例。来说明如何生成镜像并推送至镜像仓库。 准备工作 镜像仓库注册 以最常见的aliyun镜像仓库为例&#xff1a; 支付宝登录aliyun官网&#xff0c;搜索容器镜像服务&#x…

香港全新的虚拟资产服务商发牌制度

香港证监会2023年2月20日通告&#xff0c;原有虛擬資產交易平台如要符合資格參與當作為獲發牌的安排&#xff0c;必須在2023 年6 月1 日至2024 年2 月29 日期間(即由2023 年6 月1 日37起計九個月內)內&#xff0c;根據《打擊洗錢條例》下的虛擬資產服務提供者制度在網上提交完全…

python爬虫10:selenium库

python爬虫10&#xff1a;selenium库 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产…

【Linux】多线程概念线程控制

文章目录 多线程概念Linux下进程和线程的关系pid本质上是轻量级进程id&#xff0c;换句话说&#xff0c;就是线程IDLinux内核是如何创建一个线程的线程的共享和独有线程的优缺点 线程控制POSIX线程库线程创建线程终止线程等待线程分离 多线程概念 Linux下进程和线程的关系 在…