kunernetes-k8s架构的安装与使用(详细)(代码片段)

韩俊强 韩俊强     2023-03-09     232

关键词:

文章目录

我们前面学习了docker 《深入学习docker》
那么, 随着docker容器的量不断增长, 就需要一个管理docker的统一工具, 如何高效的部署和批量管理docker, 那非k8s莫属。

今天重点讲解k8s架构原理, 深入理解工作原理及流程, 熟练使用负载均衡, 以及dashboard的部署使用。
声明: 文章严禁转载~

一、kunernetes简介

欢迎来到k8s (kunernetes) 的世界

我为什么叫k8s? 了解下小故事~

  • ks之间有8个字母
  • 搭建8次才能成功

1. 为什么要用k8s ?

  • 为什么要用k8s

  • k8s是什么

  • 核心功能

  • 安装学习

2. 部署方式的变迁

3. 传统部署时代

例如, 如果在物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。

一种解决方案是在不同的物理服务器上运行每个应用程序, 但是由于资源利用不足而无法扩展, 并且维护许多物理服务器的成本很高。

4. 虚拟化部署时代

由于物理机的诸多问题, 后来出现了虚拟机

  • 作为解决方案, 引入了虚拟化
  • 虚拟化技术允许你在单个物理服务器的 CPU 上运行多个虚拟机 (VM)
  • 虚拟化允许应用程序在 VM 之间隔离, 并提供一定程序的安全
  • 一个应用程序的信息, 不能被另一应用程序随意访问
  • 虚拟化技术能够更好地利用物理服务器上的资源
  • 因为可轻松地添加或者更新应用程序, 所以可以实现更好的伸缩性, 降低硬件成本等等。
  • 每个 VM 是一台完整的计算器, 在虚拟化硬件智商运行所有组件, 包括其自己的操作系统 (内核+发行版)

缺点: 虚拟层冗余导致的资源浪费性能下降

5. 容器部署时代

  • 容器类似于 VM, 但是可以在应用程序之间共享操作系统 (OS)
  • 容器被认为是轻量级的系统, 不包含内核, 公用宿主机的内核
  • 容器与 VM 类似, 具有自己的文件系统、CPU、内存、进程控件等, 不包括内核
  • 由于它们与基础架构分离, 因此可以跨云和 OS 发行版进行移植

6. 服务器费用对比

7. k8s是什么?

官网: https://kubernetes.io/

Kubernetes 是一个开源的系统, 用于 容器化应用自动化部署扩缩容管理

Kubernetes 将多个容器组成一个逻辑单元便于管理(pod概念)。

Kubernetes 是基于 Google 内部的 15 年调度经验设计出来的系统, brog系统, 参考了业界的智慧。

官方提到的几个概念:

  • 谷歌15年经验的系统, borg系统
  • 逻辑单元, pod (用于运行多个docker容器)
  • 容器化应用, 可以是docker容器, 也可以是其他容器
    • docker的优点, 便于应用迁移, 运行, 资源隔离, 实现敏捷开发等
  • 自动化部署, k8s可以将多个容器组成的应用, 自动化部署到集群中
  • 扩缩容, 指的是能够方便的增加, 减少业务容器数量, 也就是类似我们增加, 减少服务器的概念
    • k8s自动检测服务器性能, 如果服务器压力过高, 达到一个阈值, 自动创建容器, 增加一个后端负载均衡的节点
    • 缩容, 去掉无用的节点, 节省机器资源
  • 管理, 既然应用程序全运行在容器里了, 就得管理运行期间的依赖关系, 网络, 存储, 集群关系等

8. 纯容器模式的问题

docker部署应用, 缺点是什么?

  1. 业务容器数量庞大, 哪些容器部署在哪些节点, 使用了哪些端口, 如何记录、管理, 需要登录到每台机器去管理?
  2. 跨主机通信, 多个机器中的容器之间相互调用如何做, iptables规则手动维护?
  3. 跨主机容器之间相互调用, 配置如何写? 写死固定ip+端口? 注册中心
  4. 如何实现业务高可用? 多个容器对外提供服务如何实现负载均衡?
  5. 容器的业务中断了, 如何可以感知到, 感知到之后, 如何自动启动新的容器? k8s自动帮你重新运行一个容器, 业务自动恢复正常
  6. 如何实现滚动升级保证业务的连续性?

因此, 这一切的问题, k8s 全部帮你解决了, k8s的强打, 超乎你想象, 可以说绝大多数企业, k8s都已经在生产环境运行, 这也是因为技术架构的复杂度提升, 微服务架构的存在, 只要逆向在运维道路上, 有更高的造诣和发展, k8s是一把金钥匙。

9. 为什么要用k8s

容器是打包和运行应用程序的好方式。

在生产环境中, 你需要管理运行应用的容器, 并确保不会停机。

例如, 如果一个容器发生鼓掌, 则需要启动另外一个容器。

如果系统自动处理此行为, 会不会更容易?

这就是 Kubernetes 来解决这些问题的方式。

Kubernetes 会满足你的扩展要求、鼓掌转移、部署模式等。

10. k8s提供了什么功能

二、k8s架构安装

k8s的安装部署, 分为两个角色, master 和 node (master slave 宗教)

也就是管理节点, 和工作节点

可以理解为

节点 ---- 服务器

老板 (发号施令, 且会有大老板, 二老板) , 高可用k8s集群, master01, master02 …

员工 (真正干活的, 很多个打工人) node, 正经干活的, 容器都运行在node节点上

1. k8s流程

详细图解:

如图我们要学会:

  • master怎么和node交互
  • master和node理念都有什么
  • 如何管理整个k8s集群
    • 通过图形化平台工具
    • 纯命令行访问k8s-api

2. k8s工作原理

k8s工作流程图解:

master节点 (Control Plane 控制面板): master 节点控制整个集群

master节点上有一些核心组件:

  • Controller Manager : 控制管理器, 确保集群以管理员期望的方式运行
  • etcd: 键值数据库 (redis) [记账本, 记事本], 存储集群所有的数据
  • scheduler: 调度器, 负责把业务容器调度到合适的node节点 (node节点对应一台真实服务器)
  • api server: api网关 (所有的控制都需要通过api-server), 集群访问资源入口, 提供restapi, 以及访问安全控制

node节点 (worker 工作节点):

  • kubelet (监工): 每一个node节点上必须安装的组件, 脏活累活, 都是它干
    • 比如pod管理
    • 容器健康检查, 监控
  • kube-proxy: 代理网络, 维护节点中的iptables规则

3. k8s组件交互原理(k8s使用流程?)

  1. 用户准备一个资源文件(yaml) (记录了业务应用的名称、镜像地址等信息), 通过调用APIServer执行创建Pod
  2. APIServer收到用户的Pod创建请求. 将Pod信息写入到etcd中
  3. 调度器通过通过list-watch方式, 发现有新的pod数据, 但是这个pod还没有绑定到某一个节点中, 就是这个容器, 应该创建在哪一台机器上
  4. 调度器通过调度算法, 计算出最合适pod运行的节点, 并调用APIServer, 把信息更新到etecd中
  5. kubelet同样通过list-watch方式, 发现有心得pod调用到本机的节点了, 因此调用容器运行时, 去根据pod的描述信息, 拉取镜像, 启动容器, 同时生成事件信息 (kubelet 开始干活了, 实实在在的下载镜像, 运行容器, 修改配置, 且做好记录)
  6. 同时, 把容器的信息、事件及状态也通过APIServer写入到etcd中

4.干活来了, 安装k8s (基础配置)

  • 二进制安装, 太麻烦, 可能要安装一天
  • Minikube, 学习使用
  • Kubeadm, 官方推荐, 引导方式安装

4.1 机器环境准备

准备N台服务器, 内网互通, 这里跟着我用3台就行, 为了实践我买了三台一周的服务器, 机器角色是 master, node, 喜欢记得点赞👍🏻


机器配置, 建议是不低于2c 4g

主机名节点ip角色部署组件
k8s-master0139.101.140.126Master01etcd, kube-apiserver, kube-controller-manager, kubectl, kubeadm,kubelet, kube-proxy, flannel
k8s-node018.142.174.144Node01kubectl, kubelet, kube-proxy, flannel
k8s-node028.142.175.44Node02kubectl, kubelet, kube-proxy, flannel

4.2 组件版本

组件版本说明
CentOS7.9.2009
Kernel3.10.0-1160.53.1.el7.x86_64
etcd3.3.15使用容器方式部署, 默认数据挂载到本地路径
coredns1.6.2
kubeadmv1.16.2
kubectlv1.16.2
kubeletv1.16.2
Kube-proxyv1.16.2
flannelv0.11.0

4.3 安装前环境配置

  • 注意, 有的配置是全部机器执行, 有的是部分节点执行

修改主机名

hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

添加hosts解析

cat >> /etc/hosts <<EOF
39.101.140.126 k8s-master01
8.142.174.144 k8s-node01
8.142.175.44 k8s-node02
EOF

Ping 一下检查下

ping k8s-master01
ping k8s-node01
ping k8s-node02

调整系统, 都是所有机器执行

iptables -P FORWARD ACCEPT  # 防火墙规则


swapoff -a
# 防止开机自动挂载 swap 分区
sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab


# 关闭防火墙以及selinux
sed -ri 's#(SELINUX=).*#\\1disabled#' /etc/selinux/config
setenforce 0
systemctl disable firewalld && systemctl stop firewalld


# 开启内核对流量的转发
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOF

# 让上面的内核生效一下
modprobe br_netfilter

sysctl -p /etc/sysctl.d/k8s.conf


# 配置yum基础源和docker源
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

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



# 使用cat生成yum的kubernetes源
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

yum clean all && yum makecache

4.3 安装docker(all nodes)

k8s对容器管理, 我们得选择一款容器, 安装, 那肯定是 docker

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

yum install docker-ce -y

mkdir -p /etc/docker

# 配置docker镜像加速地址
vi /etc/docker/deamon.json

		"registry-mirrors": ["http://f1361db2.m.daocloud.io"]


# 启动docker
systemctl enable docker && systemctl start docker

# 验证docker
docker version

4.4 安装k8s-master01 (master01机器执行)

k8s命令解释

安装 kubeadm, kubelet, kubectl

  • kubeadm: 用来初始化集群的指令, 安装集群的;
  • kubelet: 在集群中的每个节点上用来启动Pod 和 容器等; 管理docker的;
  • kubectl: 用来与集群通信的命令行工具, 就好比你用 docker ps , docker images类似;

操作节点: 所有的master和slave节点 ( k8s-master, k8s-slave) 需要执行

补充: yaml文件的语法; 配置文件常见的还有: ini, json, xml, yaml

yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 --disableexcludes=kubernetes

## 查看kudeadm版本
kubeadm version

## 设置kubelet开机启动, 作用是管理容器的, 下载镜像, 创建容器, 启停容器
# 确保机器一开机, kubelet服务启动了, 就会自动帮你管理pod(容器)
systemctl enable kubelet

初始化配置文件 (只在k8s-master01执行)

mkdir ~/k8s-install && cd ~/k8s-install

# 生成配置文件
kubeadm config print init-defaults > kubeadm.yaml

# 修改配置文件
vim kubeadm.yaml

只修改有标号1,2,3,4的部分, 其他请忽略

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.211.55.22  # 4.修改k8s-master01内网ip
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: k8s-m1 # 修改为第一台执行节点的hostname
  taints: null
---
controlPlaneEndpoint: 192.168.122.100:8443 # 新增控制平台地址
apiServer:
  timeoutForControlPlane: 4m0s
  extraArgs:
    authorization-mode: "Node,RBAC"
    # nfs/rbd pvc 需要用到
    feature-gates: RemoveSelfLink=false
    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeClaimResize,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,Priority"
    etcd-servers: https://k8s-m1:2379,https://k8s-m2:2379,https://k8s-m3:2379 # etcd 节点列表
  certSANs:
  - 192.168.122.100 # VIP 地址
  - 10.96.0.1  # service cidr的第一个ip
  - 127.0.0.1 # 多个master的时候负载均衡出问题了能够快速使用localhost调试
  - k8s-m1
  - k8s-m2
  - k8s-m3
  - kubernetes
  - kubernetes.default
  - kubernetes.default.svc
  - kubernetes.default.svc.cluster.local
  extraVolumes:
  - hostPath: /etc/localtime
    mountPath: /etc/localtime
    name: timezone
    readOnly: true
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager:
  extraVolumes:
  - hostPath: /etc/localtime
    mountPath: /etc/localtime
    name: timezone
    readOnly: true
dns: 
etcd:
  local:
    dataDir: /var/lib/etcd
    # etcd 高可用,需要配置多个节点
    serverCertSANs:
    - k8s-m1
    - k8s-m2
    - k8s-m3
    peerCertSANs:
    - k8s-m1
    - k8s-m2
    - k8s-m3
imageRepository: registry.aliyuncs.com/google_containers # 1.修改阿里镜像源
kind: ClusterConfiguration
kubernetesVersion: v1.16.2 # 2.修改你安装的k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16 # 3.添加pod网段, 设置容器内网络
scheduler:
  extraVolumes:
  - hostPath: /etc/localtime
    mountPath: /etc/localtime
    name: timezone
    readOnly: true
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
bindAddressHardFail: false
clientConnection:
  acceptContentTypes: ""
  burst: 0
  contentType: ""
  kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
  qps: 0
clusterCIDR: ""
configSyncPeriod: 0s
conntrack:
  maxPerCore: null
  min: null
  tcpCloseWaitTimeout: null
  tcpEstablishedTimeout: null
detectLocalMode: ""
enableProfiling: false
healthzBindAddress: ""
hostnameOverride: ""
iptables:
  masqueradeAll: false
  masqueradeBit: null
  minSyncPeriod: 0s
  syncPeriod: 0s
ipvs:
  excludeCIDRs: null
  minSyncPeriod: 0s
  scheduler: ""
  strictARP: false
  syncPeriod: 0s
  tcpFinTimeout: 0s
  tcpTimeout: 0s
  udpTimeout: 0s
kind: KubeProxyConfiguration
metricsBindAddress: ""
mode: "ipvs" # ipvs 模式
nodePortAddresses: null
oomScoreAdj: null
portRange: ""
showHiddenMetricsForVersion: ""
udpIdleTimeout: 0s
winkernel:
  enableDSR: false
  networkName: ""
  sourceVip: ""
---
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 0s
    cacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
logging: 
memorySwap: 
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s

修改完成如下:

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.29.58.226  # 4.修改k8s-master01内网ip, 根据自己服务器去填写
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: 
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers  # 1.修改阿里镜像源
kind: ClusterConfiguration
kubernetesVersion: v1.16.2  # 2.修改你安装的k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16  # 3.添加pod网段, 设置容器内网络
scheduler: 

对上面的资源清单的文档比较复杂, 想要完整了解上面的资源对象对应的属性, 可以查看对应的godoc文档, 地址:

https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2

提前下载镜像 (只在k8s-master01执行)

# 检查镜像列表
[root@k8s-master01 k8s-install]# kubeadm config images list --config kubeadm.yaml
registry.aliyuncs.com/google_containers/kube-apiserver:v1.16.2
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.16.2
registry.aliyuncs.com/google_containers/kube-scheduler:v1.16.2
registry.aliyuncs.com/google_containers/kube-proxy:v1.16.2
registry.aliyuncs.com/google_containers/pause:3.1
registry.aliyuncs.com/google_containers/etcd:3.3.15-0
registry.aliyuncs.com/google_containers/coredns:1.6.2

# 提前下载镜像
[root@k8s-master01 k8s-install]# kubeadm config images pull --config kubeadm.yaml
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.16.2
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.16.2
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.16.2
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.16.2
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.1
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.3.15-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:1.6.2

4.5 初始化k8s-master01节点

ssh工具

Mac: iterm2

Wondows : xhshell secureCRT

找一个适合自己的即可

[root@k8s-master01 k8s-install]# kubeadm init --config kubeadm.yaml
[init] Using Kubernetes version: v1.16.2
......

初始化成功如下:

[bootstrap-token] Using token: abcdef.0123456789abcdef
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
  
  # 执行如下命令, 创建配置文件 
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 你需要创建pod网络, 你的pod才能正常工作
# k8s的集群网络, 需要借助额外的插件 
# 这个先不着急, 等下个步骤做
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

# 你需要用如下命令, 将node节点, 加入集群
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.29.58.226:6443 --token abcdef.0123456789abcdef \\
    --discovery-token-ca-cert-hash sha256:ebdc26b59529e03a62207699d60b8b64c2c19991db7a912f4aeae836615dd9ea 

注意看, 最后几行信息, 就是让k8s-node01/02 公认节点, 加入到k8s集群中的命令

按照上述提示, master01操作

[root@k8s-master01 k8s-install]# mkdir -p $HOME/.kube
[root@k8s-master01 k8s-install]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master01 k8s-install]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

此时k8s集群状态, 应该是挂掉的, 这是正常的, 因为我们没有配置好k8s的网络插件

[root@k8s-master01 k8s-install]# kubectl get nodes
NAME           STATUS     ROLES    AGE    VERSION
k8s-master01   NotReady   master   7m6s   v1.16.2

接下来到k8s-node节点操作了。

4.6 添加k8s-node到集群中

所有的node节点操作, 复制上述k8s-master01生成的信息

kubeadm join 172.29.58.226:6443 --token abcdef.0123456789abcdef \\
    --discovery-token-ca-cert-hash sha256:ebdc26b59529e03a62207699d60b8b64c2c19991db7a912f4aeae836615dd9ea 
    
# 成功
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

去k8s-master01检查nodes状态 (可以尝试 -owide 显示更详细)

[root@k8s-master01 k8s-install]# kubectl get nodes
NAME           STATUS     ROLES    AGE     VERSION
k8s-master01   NotReady   master   8m35s   v1.16.2
k8s-node01     NotReady   <none>   10s     v1.16.2
k8s-node02     NotReady   <none>   8s      v1.16.2

发现, 集群中, 已经存在我们加入的2个node节点了, 但是状态还是未就绪, 还是因为网络问题

4.7 安装flannel网络插件 (k8s-master01执行)

这里可能有网络问题, 多尝试几次

wget https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

修改配置文件, 指定机器的网卡名, 大约在190行

注意: ifconfig 查看自己的网卡名字, 不一定都是eth0; [root@k8s-master01 k8s-install]# ifconfig

[root@k8s-master01 k8s-install]# vim kube-flannel.yml 
189				args:
190				- --ip-masq
191				- --kube-subnet-mgr
192				- --iface=eth0  # 添加这个配置

下载flannel网络插件镜像

[root@k8s-master01 k8s-install]# docker pull quay.io/coreos/flannel:v0.11.0-amd64
v0.11.0-amd64: Pulling from coreos/flannel
cd784148e348: Pull complete 
04ac94e9255c: Pull complete 
e10b013543eb: Pull complete 
005e31e443b1: Pull complete 
74f794f05817: Pull complete 
Digest: sha256:7806805c93b20a168d0bbbd25c6a213f00ac58a511c47e8fa6409543528a204e
Status: Downloaded newer image for quay.io/coreos/flannel:v0.11.0-amd64
quay.io/coreos/flannel:v0.11.0-amd64


# 安装flannel网络插件
[root@k8s-master01 k8s-install]# kubectl create -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged 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-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created

# 再次检查k8s集群, 确保所有节点是redy
[root@k8s-master01 k8s-install]# kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
k8s-master01   Ready    master   13m     v1.16.2
k8s-node01     Ready    <none>   4m47s   v1.16.2
k8s-node02     Ready    <none>   4m45s   v1.16.2

# 此时已经是全部正确状态
# 可以再看下集群中所有的pods状态, 确保都是正确的
[root@k8s-master01 k8s-install]# kubectl get pods -A
NAMESPACE     NAME                                   READY   STATUS    RESTARTS   AGE
kube-system   coredns-58cc8c89f4-fgjpn               1/1     Running   0          13m
kube-system   coredns-58cc8c89f4-zz245               1/1     Running   0          13m
kube-system   etcd-k8s-master01                      1/1     Running   0          12m
kube-system   kube-apiserver-k8s-master01            1/1     Running   0          12m
kube-system   kube-controller-manager-k8s-master01   1/1     Running   0          12m
kube-system   kube-flannel-ds-amd64-2sbrp            1/1     Running   0          80s
kube-system   kube-flannel-ds-amd64-lpplk            1/1     Running   0          80s
kube-system   kube-flannel-ds-amd64-zkn4k            1/1     Running   0          80s
kube-system   kube-proxy-dvnfk                       1/1     Running   0          5m5s
kube-system   kube-proxy-sbwkc                       1/1     Running   0          13m
kube-system   kube-proxy-sj8bz                       1/1     Running   0          5m3s
kube-system   kube-scheduler-k8s-master01            1/1     Running   0          12m

到此为止, k8s集群已部署完毕~

三、首次使用k8s部署应用程序

初体验, k8s部署 nginx web服务

# k8s-master01
[root@k8s-master01 k8s-install]# kubectl run my-nginx --image=nginx:alpine
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/my-nginx created

# k8s创建pod, 分

[云原生专题-24]:k8s-kubernetes(k8s)master集群构建与安装过程详细解读-初始控制节点的安装(代码片段)

...article/details/122759250目录第一步:集群规划1.1K8S的官方架构1.2K8S的实验架构1.3主要步骤1.4 K8S集群搭建方式选择1.5官方参考第二步:搭建云服务器2.1安装服务器2.2安装后检查第三步:搭建Docker环境(云平台手工操作&... 查看详情

云原生kubernetes入门详细讲解

目录1、Kubernetes是什么2、Kubernetes不是什么3、Kubernetes架构与分层4、Kubernetes集群架构5、Kubernetes集群组件5.1、K8s在Master上的组件5.2、K8s在Node上的组件6、KubernetesAPI    在云原生技术与生态快速发展的今天,越来越多的IT厂商... 查看详情

手把手从零开始搭建k8s集群超详细教程(代码片段)

本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程k8s集群搭建超详细教程1.基本环境搭建1.创建私有网络2.创建服务器资源3.远程连接到服务器4.docker容器化环境安装5.kubeadm、kubectl、kubelet... 查看详情

手把手从零开始搭建k8s集群超详细教程(代码片段)

本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程k8s集群搭建超详细教程1.基本环境搭建1.创建私有网络2.创建服务器资源3.远程连接到服务器4.docker容器化环境安装5.kubeadm、kubectl、kubelet... 查看详情

devops架构师--02kubernetes落地实践之旅(代码片段)

...ubernetes落地实践之旅纯容器模式的问题容器调度管理平台架构图核心组件工作流程架构设计的几点思考实践--集群安装k8s集群主流安装方式对比分析核心组件理解集群资源kubectl的使用实践--使用k8s管理业务应用最小调度单元Pod为... 查看详情

k8s原理架构与实战(基础篇)(代码片段)

K8S原理架构与实战(基础篇)背景容器时代的到来在介绍K8S之前,先来看看服务器的演变过程:物理机时代、虚拟机时代、容器化时代物理机时代的缺点:部署慢 :每台服务器都要安装操作系统、相关的... 查看详情

微服务架构分层

一、微服务架构名词概念podkubernetes集群最小调度或管理单元用于封装容器controller用于控制pod的行为label给kubernetes资源对象打上标签,方便其它资源关联labelselector指定关联的标签servicek8s中访问pod需要通过serviceservice通过labelselector... 查看详情

什么是k8s:k8s架构与组件详解(代码片段)

没有那么多花里胡哨,直接进行一个K8s架构与组件的学习。一、K8s架构k8s系统在设计是遵循c-s架构的,也就是我们图中apiserver与其余组件的交互。在生产中通常会有多个Master以实现K8s系统服务高可用。K8s集群至少有一个... 查看详情

kubekey安装k8s集群详细手册(代码片段)

文章目录前言一、k8s集群搭建1.安装要求2.安装k8s环境依赖3.下载KubeKey4.编辑模板5.执行模板文件结尾前言KubeKey是go语言开发的一款云原生容器工具,使用KubeKe可以轻松、高效、灵活地单独或整体安装Kubernetes和KubeSphere。本节我... 查看详情

云原生之kubernetes实战在k8s集群下helm工具的安装与使用

【云原生之kubernetes实战】在k8s集群下helm工具的安装与使用一、helm工具介绍1.helm简介2.helm的基本特性3.helm的组件二、helm-V3特点1.Helm工作示意图2.helmV3新增特性3.helm与k8s对应支持的版本三、helm的二进制安装1.下载二进制包2.解压压... 查看详情

kubernetes架构核心点详细总结!

...试Kubernetes集群中的网络延迟问题新手必须知道的Kubernetes架构如何提高FlinkK8s集群资源利用率?目录:一个目标:容器操作两地三中心四层服务发 查看详情

k8s使用手册——软件安装(代码片段)

@TOC目的  “K8s在容器编排领域已经形成统治地位,不管是开发、运维和测试,掌握kubernetes都变得非常有必要。”——相信大家应该在各类技术论坛与博客中早已看见过如上的一段话。的确在敏捷开发占主导模式的现今,... 查看详情

k8s集群架构的kubeadm部署dashboard和harbor仓库部署(代码片段)

K8S集群架构的kubeadm部署、dashboard和Harbor仓库部署一、kubeadm部署K8S集群架构实验准备工作:1.1环境准备1.2所有节点安装docker1.3master和node节点安装kubeadm,kubelet和kubectl1.4部署K8S集群二、dashboard部署2.1所有节点安装dashboard2.2... 查看详情

k8s集群架构的kubeadm部署dashboard和harbor仓库部署(代码片段)

K8S集群架构的kubeadm部署、dashboard和Harbor仓库部署一、kubeadm部署K8S集群架构实验准备工作:1.1环境准备1.2所有节点安装docker1.3master和node节点安装kubeadm,kubelet和kubectl1.4部署K8S集群二、dashboard部署2.1所有节点安装dashboard2.2... 查看详情

最详细安装k8s步骤

开源容器应用自动化部署技术KubernetesWhatisKubernetes?Kubernetes这个单词来自于希腊语,含义是舵手或领航员;Production-GradeContainerOrchestrationAutomatedcontainerdeployment,scaling,andmanagement生产环境级别的容器编排编排是什么意思?1. 按照... 查看详情

云原生|k8s系列第1篇:k8s的基础概念组件架构及实战安装(代码片段)

云原生|K8s系列第1篇目录1、先从K8s不是什么讲起2、K8s是什么及核心基础概念2.1Container容器2.2Pod2.3Node2.4Label2.5Annotations2.6Service3、K8s架构3.1K8s的工作方式3.2K8s的组件架构3.2.1控制平面组件kube-apiserveretcdkube-schedulerkube-controller-managerclou 查看详情

springcloud微服务电商系统在kubernetes集群中上线详细教程(代码片段)

...章目录Kubernetes集群部署Springcloud微服务商务系统1.微服务架构及理论概述1.1.单体架构与微服务架构的区别1.2.微服务组件架构图1.3.微服务注册中心1.4.不同的部署环境对于程序配置文件如何管理2.微服务迁移至kubernetes平台流程2.1.... 查看详情

软件架构软件架构

  本文主要阐述什么是软件架构、软件架构的重要性、什么时候软件架构尤其重要、什么是推定架构以及软件架构的三种使用方式。1.什么是软件架构?架构与详细设计  软件系统的设计由开发者的决策与意图组成。设计可... 查看详情