k8s微服务架构(代码片段)

苯酸铵酰糖化物& 苯酸铵酰糖化物&     2023-03-30     710

关键词:

1.关于Kubernetes

1.1 Kubernetes简介

Kubernetes(简称K8S)是一个开源的,用于管理云平台中多个主机上的容器化的应用,提供了应用部署、规划、更新、维护的一种机制。他的一个核心特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务)

在Kubernetes中,所有的容器均在Pod中运行,用户可以自己创建并管理Pod。一个Pod可以承载一个或多个相关的容器,同一个Pod>中的容器会部署在同一个物理机器上并且能够共享资源。一个Pod也可以包含0哥或多个磁盘卷组(volumes),这些卷组会以目录的形式提供给一个容器,或者被所有Pod中的容器共享,对于用户创建的每个Pod,系统会自动选择那个健康并且有足够容量的机器,然后创建类似容器的容器,当容器创建失败的时候,容器会被node agent自动的重启,这个node agent叫kubelet,但是,如果是Pod失败

或者机器,它不会自动的转移并且启动,除非用户定义了 replication controller。

Kubernetes支持一种特殊的网络模型,Kubernetes创建了一个地址空间,并且不动态的分配端口,它可以允许用户选择任何想使用>的端口,为了实现这个功能,它为每个Pod分配IP地址。

1.2 Kubernetes架构

kubernetes集群包含有节点代理kubelet和master组件(APls ,scheduler,etc)基于分布式的存储系统,下面这张是kubernetes架构图

在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。Kubernetes节点有运行应用容器必>备的服务,而这些都是受Master的控制。每次个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。

Kubernetes主要由以下几个核心组件组成:

  1. etcd保存了整个集群的状态
  2. apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
  3. controller manager负责维护集群状态,比如故障检测、自动扩展、滚动更新等
  4. scheduler负责资源的调度,按照预先制定的调度策略将Pod调度到相应的机器上
  5. kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
  6. Container runtime负责镜像管理以及pod和容器的真正运行
  7. kube-proxy负责为service提供cluster内部的服务发现和负载均衡

除了核心组件,还有一些推荐的Add-ons:

  1. kube-dns负责为整个集群提供DNS服务
  2. Ingress Controller为服务提供外网入口
  3. Heapster提供资源监控
  4. Dashboard提供GUI
  5. Federation提供跨可用区的集群
  6. Fluentd-elasticsearch提供集群日志采集、存储与查询

1.3 Pod、Node、容器

K8s为每个Pod都分配了唯一的IP地址。称为PodIP。一个Pod里的多个容器共享Pod IP。K8s要求底层网路支持集群内任意两个Pod之间的TCP/IP直接通信,者通常是通过二层网络技术来实现(如Flannel、Openswith)。一个Pod容器与另外主机上的Pod容器能够直接通信

Pod其实有两种类型,普通的Pod及静态的Pod(static Pod)。后者比较特殊,并不存放在K8S的etcd中存储,而是存放在某一个具体的Node上的一个文件中,并且只在此Node上启动运行。而普通的Pod一旦被创建,就会被放入到etcd中存储,随后会被K8S Master调度到某个具体的Node上面进行绑定(Binding),随后该Pod被对应的Node上的kubelet进程实例化成一组Docker容器并启动起来。默认情况下,当Pod里的某个容器停止时,K8S会自动检测这个问题,并重启启动这个Pod(Pod里面的所有容器),如果Pod所在的Node宕机,则会将这个Node上的所有Pod重新调度到其它节点上。

Pod、Node与容器的关系

1.4资源对象介绍

K8S里的所有资源对象都可以采用Yaml或JSON格式的文件定义或描述,下面的是某个Pod文件的资源定义文件

apiSerdion: v1

kind: Pod

matadata:

name: myweb

labels:

name: myweb

spec:

containers:

- name: myweb

image: kubeguide/tomcat-app:v1

ports:

- containerPort: 8080

env:

- name: MYSQL_SERVICE_HOST

value: 'mysql'

- name: MYSQL_SERVICE_PORT

value: '3306'

kind为Pod表明这是一个Pod的定义;matadata的name属性为Pod的名字,还能定义资源对象的标签Label,这里声明myweb拥有一个name=myweb的标签。

Pod里面所包含的容器组的定义则在spec中声明,这里定义一个名字为myweb,镜像为kubeguide/tomcat-app:v1的容器,该容器注入了名为MYSQL_SERVICE_HOST='mysql'和MYSQL_SERVICE_PORT='3306'的环境变量(env关键字)。Pod的IP加上这里的容器端口(containerPort)就组成了一个新的概念Endpoint(端口),它代表Pod的一个服务进程对外的通信地址。一个Pod也存在着具有多个Endpoint的情况,例如,Tomcat定义Pod时,可以暴露管理端口和服务端口这两个Endpoint。

2.部署Kubernetes集群

2.1 节点规划

环境说明(centos7.6 1810镜像)

IP地址

主机名

角色

192.168.200.10

Master

Master

192.168.200.20

Node

worker

2.2 配置互相通信

# ssh-keygen    #生成ssh 密钥对,一路回车,不输入密码

# ssh-copy-id 192.168.200.10             //把本地的ssh公钥文件安装到远程主机对应的账户

# ssh-copy-id 192.168.200.20    

          

2.3 基础环境配置

关闭防火墙和selinux

# systemctl stop firewalld && systemctl disable firewalld

# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

清除iptables规则

# iptables -F && iptables -X && iptables -Z && iptables-save

关闭swap分区

# swapoff -a && sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab

配置路由转发

br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。

# modprobe br_netfilter

# echo "modprobe br_netfilter" >> /etc/profile

# cat > /etc/sysctl.d/k8s.conf <<EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

EOF

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

2.4 安装docker

配置docker-ce的离线yum源

# tar -zxvf k8s-docker.tar.gz -C /opt/

# tee /etc/yum.repos.d/k8s-docker.repo << 'EOF'

[k8s-docker]

name=k8s-docker

baseurl=file:///opt/k8s-docker

enabled=1

gpgcheck=0

EOF

# scp /etc/yum.repos.d/k8s-docker.repo 192.168.200.20:/etc/yum.repos.d/   //发送给从节点

# scp -r /opt/k8s-docker/ 192.168.200.20:/opt/

# yum install -y yum-utils device-mapper-persistent-data lvm2              //安装依赖包

# yum install docker-ce docker-ce-cli containerd.io -y               //安装docker-ce

# systemctl start docker && systemctl enable docker

2.5 安装kubernetes集群

# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

# systemctl enable kubelet && systemctl start kubelet

注:每个软件包的作用

kubelet   :运行在集群所有节点上,用于启动Pod和容器等对象的工具

kubeadm :用于初始化集群,启动集群的命令工具

kubectl    :用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

2.6 添加阿里云镜像加速地址并修改docker文件驱动

# tee /etc/docker/daemon.json << 'EOF'



  "registry-mirrors": ["https://rncxm540.mirror.aliyuncs.com"],

  "exec-opts": ["native.cgroupdriver=systemd"]



EOF

# systemctl daemon-reload  && systemctl restart docker

2.7 初始化集群

离线导入docker镜像,避免node节点找不到镜像。

# scp -r k8s-images-v1.20.4.tar.gz 192.168.200.20:/root/

# docker load -i k8s-images-v1.20.4.tar.gz  

使用kubeadm初始化k8s集群

# kubeadm init --kubernetes-version=1.20.4 \\

--apiserver-advertise-address=192.168.200.10 \\

--image-repository registry.aliyuncs.com/google_containers  \\

--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

注:--image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8ss.grc.io拉取镜像。   我们本地有导入到的离线镜像,所以会优先使用本地的镜像。

安装完成。


# 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             //查看集群状态

此时集群状态还是NotReady状态,因为网络组件没有启动。

3.安装网络组件

安装Calico网络组件

//上传calico.yaml,使用yaml文件安装calico 网络插件

# kubectl apply -f /root/calico.yaml


//拉取镜像需要一定时间,所以我们查看pod状态为running则安装成功。

# kubectl get pod --all-namespaces


//再次查看集群状态。

# kubectl get node

4.k8s实战

4.1 实战1——安装kubernetes-dashboard

4.1.1 修改yaml文件

默认的dashboard没有配置NodePort映射

# vi recommended.yaml               //在第42行下方添加2行

      nodePort: 30000

  type: NodePort

4.1.2 添加dashboard管理员用户凭证

在原文件中追加以下内容:

# cat >> recommended.yaml << EOF

---

# ------------------- dashboard-admin ------------------- #

apiVersion: v1

kind: ServiceAccount

metadata:

  name: dashboard-admin

  namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

  name: dashboard-admin

subjects:

- kind: ServiceAccount

  name: dashboard-admin

  namespace: kubernetes-dashboard

roleRef:

  apiGroup: rbac.authorization.k8s.io

  kind: ClusterRole

  name: cluster-admin

EOF

4.1.3 安装dashboard

# kubectl apply -f recommended.yaml

# kubectl get pods --all-namespaces

4.1.4 查看登录令牌

# kubectl describe secrets -n kubernetes-dashboard dashboard-admin

token: 浏览器登录时使用以上token进行登录。

4.1.5 访问web界面

(推荐使用Firefox浏览器)https://192.168.200.10:30000/

出现此界面需要点击高级,添加例外即可成功跳转并使用token登录

首次登陆可能会比较慢,请勿反复刷新页面。

4.2 实战2——将node节点加入到集群中

4.2.1 在master上查看加入节点命令

# kubeadm token create --print-join-command

4.2.2 把node节点加入k8s集群

# kubeadm join 192.168.200.10:6443 --token 0do153.6z6lypz1sxx6jhux     --discovery-token-ca-cert-hash sha256:ab6719610f13e3e872784cde7b7a03e8c600baea6da617aced1ef0a1a05e5056

4.2.3 在node节点上查看集群状态

将master证书导入到node上,这样在node才可以使用kubectl命令管理k8s

# mkdir ~/.kube

拷贝master的配置文件到node

# scp ~/.kube/config 192.168.200.20:/root/.kube/

# kubectl get nodes               //查看集群状态


//可以看到node的ROLES角色为空,我们可以手工打上标签,这里不影响集群正常工作。

# kubectl label node node node-role.kubernetes.io/worker=worker

    此时访问web界面https://192.168.200.20:30000/也可以访问dashboard界面

4.3 实战3——通过kubernetes-dashboard创建容器

4.3.1 web界面点击+进行创建pod

4.3.2 创建nginx pod

4.3.3 点“Deploy”开始部署。

4.3.4 创建成功

查看分配的nodeport端口

浏览器访问:http://192.168.200.10:30717/ http://192.168.200.20:30717/

注:访问master,node都是可以的。

5.配置图形化管理工具Kuboard

Kuboard是一款免费的Kubernetes图形化管理工具,其力图帮助用户快速在Kubernetes上落地微服务。登录Master节点上传kuboard.tar和kuboard.yaml,使用kuboard.yaml文件部署Kuboard。

# docker load < kuboard.tar                        //导入本地镜像
# vi kuboard.yaml             //修改配置文件
# kubectl apply -f kuboard.yaml

在浏览器输入地址http://192.168.200.10:32567/(主从节点IP都可以访问),即可进入Kuboard的认证界面,在Token文本框中输入令牌后可进入Kuboard控制台.

十三,部署微服务到k8s(代码片段)

上一篇文章我们构建了微服务的Docker镜像,接下来我们将镜像部署到K8S中。完整代码:https://github.com/Justin02180218/micro-kit部署架构每个微服务启动2个pod注册到consul上,网关也启动2个pod从consul上获取微服务的一个pod实例... 查看详情

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

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

k8s微服务架构(代码片段)

...0c;然后去重启,新建,总之,让apache一直提供服务)在Kubernetes中,所有的容器均在Pod中运行,用户可以自己创建并管理Pod。一个Pod可以承载一个或多个相关的容器,同一个Pod>中的容器会部署在同一... 查看详情

《云原生入门级开发者认证》学习笔记之微服务架构介绍(代码片段)

...对云原生整个体系一直都很模糊作为Java开发来讲,微服务是大多数行业都要涉及的开源技术栈博文主要内容涉及:企业应用架构的演进:单体地狱、SOA,微服务架构,当然微服务并不是“银弹"典型的微服务框架介绍S... 查看详情

day915.安全认证架构演进:微服务阶段-springboot与k8s云原生微服务实践(代码片段)

安全认证架构演进:微服务阶段Hi,我是阿昌,今天学习记录的是关于安全认证架构演进:微服务阶段的内容。在上一篇:《安全认证架构演进:单块阶段》讲了针对单块服务阶段的安全认证架构发展演技... 查看详情

高可用集群篇--k8s部署微服务(代码片段)

高可用集群篇(五)--K8S部署微服务一、K8S有状态服务1.1什么是有状态服务1.2k8s部署MySQL1.2.1创建MySQL主从服务1.2.2测试主从配置1.2.3k8s部署总结(*)1.3k8s部署Redis1.4k8s部署ElasticSearch&Kibana1.4.1部署ElasticSearch1.5部署k... 查看详情

jenkins+gitlab+微服务发布+k8s发布(代码片段)

背景:jenkins+gitlab+微服务发布+k8s发布实现自动更新1.配置jenkinspipelinepipeline语法`nodetrystage(‘代码拉取‘)gitcredentialsId:‘xiongxj‘,url:‘[email protected]:xinjiang.xiong/oam.git‘stage(‘项目构建‘)sh"/opt/software/ap 查看详情

用友iuap云运维平台支持基于k8s的微服务架构

什么是微服务架构?微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设。微服务架构的本质,是用一些功能比较明确、业务比较精练的服务去解决更大、更实际的问题。该架构... 查看详情

微服务架构-巧妙获取被墙的docker镜像(代码片段)

原文:微服务架构-巧妙获取被墙的Docker镜像在国内由于种种原因,有些Docker镜像直接是获取不到的,特别是k8s中的一些镜像。本人在部署k8s中的helm组件时需要获取tiller镜像,如果直接用如下命令:dockerpullgcr.io/kubernetes-helm/tiller:v2... 查看详情

微服务概念(代码片段)

目录为什么需要微服务架构什么是微服务微服务架构和单体架构的比较微服务架构和SOA的比较微服务要点第一代微服务框架服务网格参考为什么需要微服务架构传统IT架构面临的一些问题:对于企业:使用传统的单体应用架构开... 查看详情

从nginxingress窥探云原生网关选型(代码片段)

...的企业开始采纳云原生理念进行应用架构转型。而K8s和微服务是云原生的两大支柱,随着云原生浪潮而被广泛应用。对多数应用而言,提供对外服务的使命并不会改变,相比于原来的单体应用,微服务架构下的应... 查看详情

微服务从代码到k8s部署应有尽有大结局(k8s部署)(代码片段)

...到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero... 查看详情

markdown微服务架构参考(代码片段)

查看详情

微服务环境搭建(代码片段)

微服务内容一、微服务概念1.单体、分布式、集群1.1单体1.2分布式1.3集群2.系统架构演变2.1单体应用架构2.2垂直应用架构2.3分布式架构2.4微服务架构3.微服务架构介绍4.SpringCloud介绍(了解)4.1SpringBoot和SpringCloud有啥关系?4.2SpringCloud版... 查看详情

微服务从代码到k8s部署应有尽有系列全集(代码片段)

...到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero... 查看详情

一文详解微服务架构(代码片段)

...????????来源:cnblogs.com/skabyy/p/11396571.html本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件... 查看详情

微服务架构基础(代码片段)

微服务架构基础(五)持续更新…继续前面的基础四工程进行扩展分布式配置中心微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必... 查看详情

微服务-搭建k8s(minikube)与简单wordpress实战(代码片段)

...状态,kubescheduler负责容器的编排,etcd负责持久化存储和服务发现。这4个组件也都被容器化了,运行在集群的Pod里,我们可以用kubectl来查看它们的状态,使用命令:kubectlgetpod-nkube-system安装我使用的电脑是MacproM2芯的,使用的虚... 查看详情