介绍如何在kubernetes集群中部署一个Nginx服务,并且能够对其访问。
kubernetes在集群启动之后,会默认创建几个namespace。
kubectl get namespace
default:所有未指定的Namespace的对象都会被分配在default命名空间。
kube-node-lease:集群节点之间的心跳维护,v1.13开始引入。
kube-public:此命名空间的资源可以被所有人访问(包括未认证用户)。
kube-system:所有由kubernetes系统创建的资源都处于这个命名空间。
kubectl get namespace
kubectl get ns
kubectl get namespace default
kubectl get ns default
kubectl get ns default -o wide
kubectl get ns default -o json
kubectl get ns default -o yaml
kubectl describe namespace default
kubectl describe ns default
kubectl create namespace dev
kubectl create ns dev
kubectl delete ns dev
① 新建ns-dev.yaml:
apiVersion: v1
kind: Namespace
metadata:name: dev
② 通过命令式对象配置进行创建和删除:
kubectl create -f ns-dev.yaml
kubectl delete -f ns-dev.yaml
kubectl get pods -n kube-system
语法:创建并运行Pod
kubectl run (Pod的名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev
Tips:新版kubectl run 启动pod形式,不会自动创建
deployment
控制器了,因此,在对该pod进行删除时,不会自动重建
kubectl get pods [-n 命名空间的名称]
kubectl get pods -n dev
kubectl describe pod pod的名称 [-n 命名空间名称]
kubectl describe pod nginx -n dev
# 获取Pod的IP
kubectl get pods [-n dev] -o wide# 通过curl访问
curl ip:端口
kubectl get pods -n dev -o wide
curl 10.244.2.7:80
kubectl delete pod pod的名称 [-n 命名空间]
kubectl delete pod nginx -n dev
① 新建pod-nginx.yaml:
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: dev
spec:containers:- image: nginx:1.17.1imagePullPolicy: IfNotPresentname: podports: - name: nginx-portcontainerPort: 80protocol: TCP
② 执行创建和删除命令:
kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml
Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
可以通过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作。
一些常用的Label标签示例如下:
● 版本标签:“version”:”release”,”version”:”stable”。。。
● 环境标签:“environment”:”dev”,“environment”:”test”,“environment”:”pro”。。。
● 架构标签:“tier”:”frontend”,”tier”:”backend”。。。
kubectl label pod xxx key=value [-n 命名空间]
kubectl label pod nginx version=1.0 -n dev
kubectl label pod xxx key=value [-n 命名空间] --overwrite
kubectl label pod nginx version=2.0 -n dev --overwrite
kubectl get pod xxx [-n 命名空间] --show-labels
kubectl get pod nginx -n dev --show-labels
kubectl get pod -l key=value [-n 命名空间] --show-labels
kubectl get pod -l version=2.0 -n dev --show-labels
kubectl label pod xxx key- [-n 命名空间]
kubectl label pod nginx version- -n dev
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: devlabels:version: "3.0"env: "test"
spec:containers:- image: nginx:1.17.1imagePullPolicy: IfNotPresentname: podports: - name: nginx-portcontainerPort: 80protocol: TCP
② 执行创建和删除命令:
kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml
特别注意:在v1.18版之后,kubectl run nginx --image=nginx --replicas=2 --port=80,会反馈Flag --replicas has been deprecated, has no effect and will be removed in the future,并且只会创建一个Nginx容器实例。
kubectl create deployment xxx [-n 命名空间]
kubectl create deploy xxx [-n 命名空间]
kubectl create deployment nginx --image=nginx:1.17.1 -n test
kubectl scale deployment xxx [--replicas=正整数] [-n 命名空间]
kubectl scale deployment nginx --replicas=4 -n dev
① 创建一个deploy-nginx.yaml,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: dev
spec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginx:1.17.1name: nginxports:- containerPort: 80protocol: TCP
② 执行创建和删除命令:
kubectl create -f deploy-nginx.yaml
kubectl delete -f deploy-nginx.yaml
kubectl get pods [-n 命名空间]
kubectl get pods -n dev
kubectl get deployment [-n 命名空间]
kubectl get deploy [-n 命名空间]
kubectl get deployment -n dev
kubectl describe deployment xxx [-n 命名空间]
kubectl describe deploy xxx [-n 命名空间]
kubectl describe deployment nginx -n dev
kubectl delete deployment xxx [-n 命名空间]
kubectl delete deploy xxx [-n 命名空间]
kubectl delete deployment nginx -n dev
我们已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务,虽然每个Pod都会分配一个单独的Pod的IP地址,但是却存在如下的问题:
Pod的IP会随着Pod的重建产生变化。
Pod的IP仅仅是集群内部可见的虚拟的IP,外部无法访问。
这样对于访问这个服务带来了难度,因此,kubernetes设计了Service来解决这个问题。
Service可以看做是一组同类的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡。
kubectl expose deployment xxx --name=服务名 --type=ClusterIP --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 会产生一个CLUSTER-IP,这个就是service的IP,在Service的生命周期内,这个地址是不会变化的
kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n test
kubectl get service [-n 命名空间] [-o wide]
kubectl get service -n test
kubectl expose deployment xxx --name=服务名 --type=NodePort --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 会产生一个外部也可以访问的Service
kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
minikube需要执行:
minikube service svc-nginx2 -n dev --url
再通过对应的ip端口访问
kubectl get service [-n 命名空间] [-o wide]
kubectl get service -n test
kubectl delete service xxx [-n 命名空间]
kubectl delete service svc-nginx1 -n test
① 新建svc-nginx.yaml,内容如下:
apiVersion: v1
kind: Service
metadata:name: svc-nginxnamespace: dev
spec:clusterIP: 10.109.179.231ports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: ClusterIP
② 执行创建和删除命令:
kubectl create -f svc-nginx.yaml
kubectl delete -f svc-nginx.yaml
下一篇:软件项目管理教程