k8s

结构

master:k8s主机器(也可以多个master)
node:k8s集群机器

master控制node-->service(服务)-->deployment(控制器)-->pod-->docker-->部署应用

部署项目步骤

1.项目本身打包成jar或者war包,可以通过工具
2.制作项目镜像(写dockerfile文件)
3.用k8s部署镜像(命令方式或者yaml文件方式)
4.对外暴露服务(3中方式,线上用ingress方式)



制作镜像:docker build -t 镜像名字 -f dockerfile路径 .
生成yaml文件:kubectl create deployment 控制器取名 --image=镜像名 --dry-run -o yaml>./文件名.yaml
修改yaml文件拉取本地镜像:imagePullPolicy: Never
应用yaml文件:kubectl apply -f 部署文件.yaml
查看是否启动:kubectl get pods
暴露端口(给外部访问):kubectl expose deployment nginx --port=80 --type=NodePort

运维工具

运维工具:
	Ansible
	Docker
		docker compose ---面向一台
		docker swarm   ---面向docker集群
		docker machine ---加入docker swarm的成员
	DevOps

部署k8s准备工作

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

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

# 关闭swap(k8s禁止虚拟内存,提高性能)
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久

# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.1.1 k8smaster
192.168.1.2 k8snode
EOF

# 设置网桥参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 时间同步,多台服务器时间同步
yum install ntpdate -y
ntpdate time.windows.com

Kubelet、Kubeadm、Kubectl

安装Kubelet、Kubeadm、Kubectl
Kubelet:运行在cluster所有节点上,负责启动POD和容器
Kubeadm:用于初始化cluster
Kubectl:Kubectl是Kubenetes命令行工具,通过Kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组建

命令

kubectl get nodes                          # 查询有哪些节点
kubectl get pods -n kube-system            # 列出pods下的资源
kubectl get namespace # 命名空间  简写:kubectl get ns


kubectl get deployment										 # 查控制器
kubectl get pod														 # 查pod
docker images															 # 查镜像
docker ps																	 # 查容器
kubectl get service												 # 查集群服务
kubectl describe pods pod名称               # 查看pod详情事件
kubectl logs -f pod名称                     # 不断输出日志
kubectl apply -f 配置文件名.yaml             # 应用配置文件

创建控制器deployment

# 拉取镜像创建容器并启动,名为nginx
kubectl create deployment nginx --image=nginx

暴露端口

# 暴露nginx端口,给外部访问
kubectl expose deployment nginx --port=80 --type=NodePort

k8s集群中部署nginx

# 拉取镜像创建容器并启动,名为nginx
kubectl create deployment nginx --image=nginx
# 暴露nginx端口,给外部访问
kubectl expose deployment nginx --port=80 --type=NodePort

k8s集群部署微服务

1.项目打包(jar,war)-->采用工具打包,maven,jenkins
2.制作Dockerfile文件,生成镜像
3.kubectl create deployment 名字 --image=你的镜像名字
4.你的springboot就部署好了,是以docker容器的方式运行在pod里面

通过dockerfile构建镜像

-f :指定要使用的Dockerfile路径;
-t :镜像的名字以及标签
. :构建镜像在当前目录
docker build -t 镜像名字 -f dockerfile路径 .

运行镜像

docker run -d 镜像id

空运行测试

# 生成yaml拷贝出来改改
kubectl create deployment 控制器取名 --image=镜像名 --dry-run -o yaml>./deploy.yaml

eg:
kubectl create deployment nginx3 --image=nginx --dry-run -o yaml > ./deploy.yaml



deploy.yaml内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx3
  name: nginx3
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx3
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx3
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

k8s拉取本地镜像参数配置

 containers:
      - name: myweb
        image: myweb-image
        imagePullPolicy: Never

命令部署

kubectl create deployment 控制器取名 --image=镜像名

yaml文件方式部署

部署文件.yaml:资源清单

kubectl apply -f 部署文件.yaml
等价于
kubectl create deployment 控制器取名 --image=镜像名

暴露应用的三种方式NodePort、LoadBalancer 和 Ingress

# 暴露nginx端口,给外部访问
kubectl expose deployment nginx --port=80 --type=NodePort

NodePort方式

NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里;

这种方式不足:
1.一个端口只提供一个服务使用
2.只能使用30000-32767之间的端口
3.如果节点/虚拟机的IP地址发送变化,需要人工处理;
所以在生产环境,不推荐这种方式发布服务

web浏览器访问:

比如一个web应用需要被其他用户访问,那么需要配置type=NodePort,而且怕诶之nodePort=30001,那么其他机器就可以通过柳萋萋访问:scheme://node:30001访问到该服务。

NodePort 服务的 YAML 文件类似如下:

apiVersion: v1
kind: Service
metadata:  
name: my-nodeport-service
selector:    
app: my-app
spec:
type: NodePort   # type配置
ports:  
- name: http
port: 80        # 集群各个内部访问端口
targetPort: 80	# 容器内部端口
nodePort: 30036  # 外部暴露端口,可以指定
protocol: TCP

命令

kubectl expose deployment mysql --port=3306 --target-port=3306 --type=NodePort  # 产生30000以上的随机端口


kubectl create deployment mysql --image=mysql --dry-run -o yaml > ./deploy.yaml  # 测试启动,产生yaml文件

LoadBalancer方式

LoadBalancer可以暴露服务,这种方式需要向云平台申请负载均衡器

LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个 Network Load Balancer,它将给你一个单独的 IP 地址,转发所有流量到你的服务。

何时使用这种方式?

如果你想要直接暴露服务,这就是默认方式。所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类

缺点:
每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费,这将会产生成本。

Ingress方式

Ingress不是k8s内置的(安装好k8s之后,并没有安装ingress),需要单独安装,而且有多种类型。我们一般选择官方维护的ingress Nginx;
有别于以上所有例子,Ingress 事实上不是一种服务类型。相反,它处于多个服务的前端,扮演着“智能路由”或者集群入口的角色。
你可以用 Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能力。

GKE 上的默认 ingress 控制器是启动一个 HTTP(S) Load Balancer。它允许你基于路径或者子域名来路由流量到后端服务。例如,你可以将任何发往域名 foo.yourdomain.com 的流量转到 foo 服务,将路径 yourdomain.com/bar/path 的流量转到 bar 服务。

使用ingress步骤:

1.部署ingress Nginx;
2.配置ingress niginx规则;

采用ingress暴露容器化应用(nginx):

1.部署一个容器化应用(pod),比如nginx程序
kubectl create deployment nginx --image=nginx

2.暴露该服务
kubectl expose deployment nginx --port=80 --type=NodePort

3.部署ingress nginx
https://github.com/kubernetes/ingress-nginx
ingress-nginx是使用nginx作为反向代理和负载均衡的k8s的ingress控制器;

# 下载
wget kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml

329行spec下加一行:hostNetwork:true
332行修改阿里云image镜像:
阿里云镜像首页:http://dev.aliyun.com/去搜索ingress-nginx镜像



4.应用文件,自动部署ingress环境
kubectl apply -f deploy.yaml

5.查看ingress的状态
kubectl get pods -n ingress-nginx

6.应用配置ingress规则
kubectl apply -f ingress-nginx.yaml

如果报错:删除模块
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
再次应用配置ingress文件

ingress-nginx.yaml配置文件:

检查一下:

kubectl get ingress  #简写kubectl get ins  # 查规则
kubectl get service -n ingress-nginx
kubectl get deploy -n ingress-nginx
kubectl get pods -n ingress-nginx

GKE 上用 L7 HTTP Load Balancer 生成的 Ingress 对象的 YAML 文件类似如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
backend:
serviceName: other
servicePort: 8080
rules:
- host: foo.mydomain.com
http:
  paths:
  - backend:
      serviceName: foo
      servicePort: 8080
- host: mydomain.com
http:
  paths:
  - path: /bar/*
    backend:
      serviceName: bar
      servicePort: 8080

何时使用这种方式?

如果你想要使用同一个 IP 暴露多个服务,这些服务都是使用相同的七层协议(典型如 HTTP),那么Ingress 就是最有用的。如果你使用本地的 GCP 集成,你只需要为一个负载均衡器付费,且由于 Ingress是“智能”的,你还可以获取各种开箱即用的特性(比如 SSL,认证,路由,等等)。

添加副本数,快速扩容

kind:deployment配置文件

--replicas=4   # 副本数4

spec:
  replicas:4


kubectl apply -f 配置文件名.yaml  # 应用配置
posted @ 2021-07-05 10:24  Jeff的技术栈  阅读(208)  评论(0编辑  收藏  举报
回顶部