目录
一 Namespace
Namespce是k8s非常重要的资源,主要的作用是来实现 多套环境的资源隔离 或者 多租户的资源隔离
//k8s默认创建了自定义namesapce 可以简写成ns
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 4h23m ##未指定namespace 分配的空间
dev Active 22m ## 自己自定义的
kube-flannel Active 3h1m ##
kube-node-lease Active 4h24m ##集群心跳维护
kube-public Active 4h24m ##此空间可以被所有人访问
kube-system Active 4h24m ##由系统创建的资源都处于这个命令空间
二 pod
pod是k8s集群管理的最小单元,程序必须要部署在容器里面,而容器必须存在pod中
//k8s集群的组件也是通过组件的方式去运行的
[root@master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6d8c4cb4d-jzv2k 1/1 Running 0 4h41m
coredns-6d8c4cb4d-wdzsg 1/1 Running 0 4h41m
etcd-master 1/1 Running 2 4h41m
kube-apiserver-master 1/1 Running 2 4h41m
kube-controller-manager-master 1/1 Running 2 4h41m
kube-proxy-6qf2n 1/1 Running 0 3h55m
kube-proxy-nvhd9 1/1 Running 0 4h41m
kube-proxy-xwsth 1/1 Running 0 3h55m
kube-scheduler-master 1/1 Running 2 4h41m
//创建一个nginx pod
[root@master ~]# kubectl run nginx --image=nginx --namespace=dev --port=80
pod/nginx created
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
nginx 0/1 ContainerCreating 0 15s
//查看pod详细信息 如需更详细则使用describe
[root@master ~]# kubectl get pod nginx -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 5m54s 10.244.2.5 server1 <none>
三 label
label是k8s中系统中一个重要的概念,他的作用就是在资源上天机标识,用来对他们进行区分和选择
label的特点:
- 一个label会以key/value键值对的形式附加到各种对象上,如node pod service等
- 一个资源对象可以定义任意数量的label,同一个label也可以被添加到任意数量的资源对象上去
- label通常在资源对象定义时确定,当然也可以在对象创建后动态添加和删除
//查看dev空间下的nginx 是否带有标签
[root@master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 115s <none>
//打上标签并且查看
[root@master ~]# kubectl label pod nginxpod -n dev version=1
pod/nginxpod labeled
[root@master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 3m18s version=1
//更新标签
[root@master ~]# kubectl label pod nginxpod -n dev version=2 --overwrite
pod/nginxpod labeled
[root@master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 6m25s version=2
//筛选标签
[root@master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 9m16s version=2
nginxpod-v1 1/1 Running 0 75s version=1
[root@master ~]# kubectl get pod -l "version!=2" -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod-v1 1/1 Running 0 11m version=1
//删除标签
[root@master ~]# kubectl label pod nginxpod-v1 -n dev version-
pod/nginxpod-v1 unlabeled
[root@master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 13m version=2
nginxpod-v1 1/1 Running 0 5m11s <none>
//编辑ymal文件
[root@master ~]# cat nginxpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginxpod-v1
namespace: dev
labels: //添加标签
version: "1"
env: "test"
spec:
containers:
- name: nginx-containers
image: nginx
//更新pod
[root@master ~]# kubectl apply -f nginxpod.yaml
Warning: resource pods/nginxpod-v1 is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
pod/nginxpod-v1 configured
[root@master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 17m version=2
nginxpod-v1 1/1 Running 0 9m19s env=test,version=1
//可以看到已经添加成功
四 deployment
k8s很少直接管理控制pod,一般都是通过pod控制器完成,当pod的资源出现故障时,会尝试进行重启或者重建pod
命令格式 :kubectl run deployment 名称 【参数】
- --image 指定镜像
- --port 指定端口
- --replicas 指定创建数量
- --namespace 指定ns
//用deployment创建一个nginxpod-v2的pod
[root@master ~]# kubectl create deployment nginxpod-v2 --image=nginx --port=80 --namespace=dev
deployment.apps/nginxpod-v2 created
//查看deployment
[root@master ~]# kubectl get deployment,pod -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginxpod-v2 1/1 1 1 104s
NAME READY STATUS RESTARTS AGE
pod/nginxpod 1/1 Running 0 42m
pod/nginxpod-v1 1/1 Running 0 34m
pod/nginxpod-v2-59547fb4c7-qf5x6 1/1 Running 0 104s
五 service
每个pod都会分配一个单独的pod IP 然后却存在如下两问题:
- pod IP会随着pod的重建而修改IP地址
- pod IP仅仅是集群内可见的虚拟ip,外部无法访问
service可以看作是一组同类的pod对外访问接口,借助service可以方柏霓的实现服务发现和负载均衡
//创建集群内部可以访问的service
[root@master ~]# kubectl create deployment tomcat --port=8080 --image=tomcat --namespace=dev
deployment.apps/tomcat created
[root@master ~]# kubectl expose deployment tomcat --name=svc-tomcat --type=ClusterIP --port=8080 --target-port=8080 -n dev
service/svc-tomcat exposed
//查看服务
[root@master ~]# kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-tomcat ClusterIP 10.99.103.195 <none> 8080/TCP 74s
[root@master ~]# curl 10.99.103.195:8080
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>##上述创##上面创建的service的类型为 cluster ip 这个IP地址只能集群内部可以访问
##如果需要创建集群外部也能访问的service 需要将类型修改为nodeport
//删除服务
[root@master ~]# kubectl delete svc svc-tomcat -n dev
service "svc-tomcat" deleted
//创建服务
[root@master ~]# kubectl expose deployment tomcat --name=svc-tomcat --type=NodePort --port=8080 --target-port=8080 -n dev
[root@master ~]# kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-tomcat NodePort 10.103.223.109 <none> 8080:31603/TCP 24s
##只需要在外部主机访问IP+端口号31603即可
通过yaml文件去定义
六 总结
至此,已经掌握了namespace pod deployment service的基本操作,基本可以实现在
k8s中实现一个简单的服务部署和访问了,但是如果想要更好的使用kubernets,就需要深入学习这几种资源的细节和原理