Kunbernetes(k8s)的基本概念详解+部署

kubernetes部署

一、关于kubernetes

1、简介:

Kubernetes 简称 k8s,是支持云原生部署的一个平台,起源于谷歌。谷歌早在十几年之前就对其应用,通过容器方式进行部署。

k8s 本质上就是用来简化微服务的开发和部署的,关注点包括自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics 监控、日志监控、弹性和容错、API 管理、服务安全等,k8s 将这些微服务的公共关注点以组件形式封装打包到 k8s 这个大平台中,让开发人员在开发微服务时专注于业务逻辑的实现,而不需要去特别关系微服务底层的这些公共关注点,大大简化了微服务应用的开发和部署,提高了开发效率。

题外话:建议配合rancher(k8s管理平台)使用,谁™闲的天天写yml。

2、Kubernetes 架构:

在这里插入图片描述

3、Master节点的组成:

API server:
kube-apiserver对外提供操作和获取 k8s 集群资源的的 API,是唯一操作 etcd 的组件,其他的组件包括管理员操作都是通过 API server 进行交互的,可以将它理解成 etcd 的 “代理人”。

Etcd:
一种的分布式键值存储机制,底层采用 Raft 协议,k8s 集群的状态数据包括配置、节点等都存储于 etcd 中,它保存了整个集群的状态

Scheduler:
在 k8s集群中做调动决策,负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上。

Controller Manager:
相当于集群状态的协调者,观察着集群的实际状态,与 etcd 中的预期状态进行对比,如果不一致则对资源进行协调操作让实际状态和预期状态达到最终的一致,维护集群的状态,比如故障检测、自动扩展、滚动更新等。

补充说明
关于Etcd:
1、etcd的数据存储结构是基于键值对的,每个键值对都由一个唯一的键(Key)和对应的值(Value)组成。
2、Value储存与Key关联的数据,可以是字符串、JSON,限制大小为1M。
3、除了key和value外,还存储了Directory(目录)和TTL(Time-to-Live),目录本身也是一个键值对,其值为空,支持设置Key的TTL,Key的TTL到期后,系统会自动将其删除。
4、Etcd主要通过Raft一致性算法来保证在分布式环境中的一致性,Raft确保在集群中的大多数节点存活时,系统仍然能够工作。
5、Raft一致性算法有兴趣的读者自行去查阅,其主要思想是领导者选举机制和日志复制。

Controller和Scheduler的异同:
虽然Controller Manager和Scheduler都涉及到在Kubernetes集群中调度和管理资源,但它们的角色和职责是不同的。
Scheduler负责将新创建的Pod调度到集群中的具体节点上,它考虑节点的资源利用率、亲和性规则、反亲和性规则等因素,以实现资源的有效利用和Pod的平衡分布。
而Controller Manager是一个控制器的集合,每个控制器负责监控和维护特定类型的资源,确保它们的状态符合用户定义的期望状态。

4、Worder节点的组成:

Controller Runtime:
下载镜像和运行容器的组件,负责镜像管理以及 Pod 和容器的真正运行(CRI)。

Pod:
k8s 中特有的一个概念,可以理解为对容器的包装,是 k8s 的基本调度单位,实际的容器时运行在 Pod 中的,一个节点可以启动一个或多个 Pod。

Kubelet:
运行在每个Worker节点上的主要组件,负责管理节点上的容器。它与Master节点的Kubernetes API Server通信,接收Pod规范,确保Pod中的容器在节点上正确运行。Kubelet还负责监控容器的健康状态,并在需要时重新启动容器。

kube-proxy:
用于实现Kubernetes服务发现和负载均衡的组件。它维护节点上的网络规则,负责将服务的请求转发到正确的Pod。

CNI插件(Container Network Interface):

用于设置和管理容器之间的网络连接。它负责创建Pod的网络命名空间、配置网络接口、设置IP地址等。常见的CNI插件包括Flannel、Calico、Weave等。

5、Kunbernetes 的核心概念:

组成释义
集群 Cluster超大计算机抽象,由节点组成
容器 Container应用居住和运行在容器中
PODKubernetes 基本调度单位
副本集 ReplicaSetpod副本数量维持控制器
服务 Service应用Pods的访问点,屏蔽IP寻址和负载均衡
发布 Deployment管理ReplicaSet,支持滚动等高级发布机制
ConfigMap应用配置,secret敏感数据配置
DaemonSet保证每个节点有且仅有一个Pod,常见于监控

二、K8s部署

1、基础环境准备

准备1主2从三台linux服务器,并在/etc/hosts创建映射
[root@master ~]# cat /etc/hosts
192.168.2.120 master
192.168.2.121 node1
192.168.2.122 node2
关闭防火墙和selinux:
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
关闭swap分区(如未关闭,k8s集群无法正常初始化)
swapoff -a    # 临时关闭
vim /etc/fstab # 注释掉swap那一行永久关闭
添加k8s阿里云yum源:
cat > /etc/yum.repos.d/kubernetes.repo << EOF[kubernetes]
[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[kubernetes]

2、安装kubeadm,kubelet和kubectl

yum install -y kubelet  kubeadm  kubectl
systemctl start kubelet
systemctl enable kubelet
如linux内核版本过低,应升级至高版本内核(坑点一)
1、rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org,如下载报错则手动下载上传至服务器
2、yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm,如下载报错则手动上传并本地安装
3、安装最新内核版本:yum --disablerepo='*' --enablerepo=elrepo-kernel install kernel-lt -y
4、grub2-set-default 0、
5、reboot
如果有报错:The connection to the server localhost:8080 was refused - did you specify the right host or port?(坑点二)
将主节点admin.conf传到node的同级目录
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
部署k8s的master和node节点

master下执行:(备注:初始化命令后指定容器内的网段,用于容器间通讯,注意不要和宿主机内网网段冲突)

kubeadm init  --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 

master执行后生成该段则执行成功:

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.2.120:6443 --token 9j7pr7.2aeynkg9cnzyw5dy \
	--discovery-token-ca-cert-hash sha256:1774e6a63628577011f37493dee99827e2a3742ca80d9e65edb31cb559b7cdc3

如生成失败或者服务器变动需要重置集群时:

kubeadm reset

nodes下将节点加入master集群:

kubeadm join 192.168.2.120:6443 --token 9j7pr7.2aeynkg9cnzyw5dy \
	--discovery-token-ca-cert-hash sha256:1774e6a63628577011f37493dee99827e2a3742ca80d9e65edb31cb559b7cdc3

配置网络插件:(未配置可能导致集群初始化失败)

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

完成后在master节点查看集群状态:

[root@master cache]# kubectl get nodes
NAME     STATUS   ROLES                  AGE     VERSION
master   Ready    control-plane,master   32m     v1.22.4
node1    Ready    <none>                 5m56s   v1.22.4
node2    Ready    <none>                 5m48s   v1.22.4

至此1主2从的k8s集群搭建完成

三、常用的k8s命令

命令释义
kubectl run testapp --image=xxxx启动一个镜像为xxxx,名为testapp的pod
kubectl get pod查看当前k8s集群中正在运行的pod
kubectl logs nginx查看名为nginx的pod的日志
kubectl get pod -o wide查看各个pod在k8s集群中的分布
kubectl delete all --all删除所有pod
kubectl get nodes查看集群中的各个node节点

四、k8s的应用1-简易搭建nginx

1、拉取一个nginx镜像:
[root@master ~]# docker pull nginx
[root@master ~]# docker images|grep nginx
nginx        latest     eea7b3dcba7e   Less than a second ago   187MB
2、kube启动一个nginx的pod,并将80端口暴露出来:
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
3、查看构建的pod状态:
[root@master ~]# kubectl get pod,svc,nodes
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-rj4vv   1/1     Running   0          44s
4、查看该pod所在节点及映射的节点端口:
[root@master ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-rj4vv   1/1     Running   0          2m19s   10.244.0.5   node2   <none>           <none>
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        2m56s
nginx        NodePort    10.104.75.154   <none>        80:31331/TCP   2m25s
5、curl请求node节点及port检查是否正常开放(如下即表示正常):
[root@master ~]# curl node2:31331
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • 32
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基本的在k8s部署zookeeper + kafka集群的配置教程: 1. 创建一个namespace 首先,我们需要创建一个namespace,用于部署zookeeper和kafka集群。可以使用以下命令创建一个名为“zookeeper-kafka”的namespace: ``` kubectl create namespace zookeeper-kafka ``` 2. 部署Zookeeper 接下来,我们需要部署Zookeeper。可以使用以下YAML文件创建一个Zookeeper服务: ``` apiVersion: v1 kind: Service metadata: name: zookeeper spec: selector: app: zookeeper ports: - name: client port: 2181 protocol: TCP - name: follower port: 2888 protocol: TCP - name: leader port: 3888 protocol: TCP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: zookeeper spec: serviceName: zookeeper replicas: 3 selector: matchLabels: app: zookeeper template: metadata: labels: app: zookeeper spec: containers: - name: zookeeper image: zookeeper:3.5.8 ports: - name: client containerPort: 2181 - name: follower containerPort: 2888 - name: leader containerPort: 3888 volumeMounts: - name: datadir mountPath: /data env: - name: ZOO_MY_ID valueFrom: fieldRef: fieldPath: metadata.name - name: ZOO_SERVERS value: zookeeper-0.zookeeper:2888:3888,zookeeper-1.zookeeper:2888:3888,zookeeper-2.zookeeper:2888:3888 volumeClaimTemplates: - metadata: name: datadir spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` 这将创建一个3个Pod的Zookeeper StatefulSet,并创建一个名为“zookeeper”的Service,暴露Zookeeper的客户端端口2181,follower端口2888和leader端口3888。 3. 部署Kafka 现在,我们可以部署Kafka。以下是一个Kafka部署的YAML文件示例: ``` apiVersion: v1 kind: Service metadata: name: kafka spec: type: NodePort selector: app: kafka ports: - name: kafka port: 9092 nodePort: 30092 protocol: TCP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: kafka spec: serviceName: kafka replicas: 3 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: wurstmeister/kafka:2.13-2.7.0 ports: - name: kafka containerPort: 9092 env: - name: KAFKA_BROKER_ID valueFrom: fieldRef: fieldPath: metadata.name - name: KAFKA_ZOOKEEPER_CONNECT value: zookeeper-0.zookeeper:2181,zookeeper-1.zookeeper:2181,zookeeper-2.zookeeper:2181 - name: KAFKA_ADVERTISED_LISTENERS value: PLAINTEXT://$(hostname -f):9092 - name: KAFKA_LISTENERS value: PLAINTEXT://0.0.0.0:9092 - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR value: "3" volumeMounts: - name: datadir mountPath: /data volumeClaimTemplates: - metadata: name: datadir spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` 这将创建一个3个Pod的Kafka StatefulSet和一个名为“kafka”的Service,它将Kafka的9092端口暴露为NodePort 30092。 4. 验证部署 现在,您可以使用以下命令检查Zookeeper和Kafka是否正在运行: ``` kubectl get pods -n zookeeper-kafka ``` 您应该看到3个Zookeeper和3个Kafka Pod处于“Running”状态。 接下来,您可以使用以下命令检查Kafka是否正在监听端口30092(或您自己选择的端口): ``` kubectl get services -n zookeeper-kafka ``` 您应该看到一个名为“kafka”的service,它将Kafka的9092端口暴露为30092端口。可以使用此端口测试Kafka是否正常运行。 至此,您已经成功地在k8s部署了zookeeper + kafka集群。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值