文档:https://www.yuque.com/fairy-era/yg511q/hg3u04
学习视频是b站的黑马视频。
现在基本部署都是容器化部署,虽说容器化部署很方便,但也会有一些问题,比如:
Service跟apiServer不一样,Service是对外服务的统一入口,可以实现负载均衡,通过label堆pod进行分类,然后控制流量访问到哪个pod。
NameSpace,隔离pod,即不同NameSpace的pod无法互相访问。
使用kubeadm,这里使用三台虚拟机,自己配置ipv4地址。
环境搭建
具体其他操作可以观看https://www.cnblogs.com/weicunqi/p/14894122.html
当我们搭建好环境之后,可以启动一个ngxin试一下:
启动成功。
在k8s中,一切皆资源。
* k8s是一个集群系统,用户可以在集群中部署各种服务,而部署服务就是在k8s集群中,运行一个一个容器。
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
kubectl create/patch -f nginx-pod.yaml
kubectl apply -f nginx-pod.yaml
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
kubectl [command] [type] [name] [flags]
kubectl get pod xxxx --namespace xxx
查看xxx命名空间内的xxx pod情况
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看: kubectl api-resources
命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。
命令式对象配置的方式操作资源,可以简单的认为:命令 + yaml配置文件(里面是命令需要的各种参数)
声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)
使用apply操作资源:
如果资源不存在,就创建,相当于 kubectl create
如果资源已存在,就更新,相当于 kubectl patch
创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yaml
删除资源 使用命令式对象配置 kubectl delete -f XXX.yaml
查询资源 使用命令式对象管理 kubectl get(describe) 资源名称
YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。
像.yml文件的编写等等都是用这种语法。
记住一点:Namespace可以将Pod隔离(跟label的区别),让其不可以互相访问。
不同组互相隔离,比如开发者看不到测试组。
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 45h # 所有未指定Namespace的对象都会被分配在default命名空间
kube-node-lease Active 45h # 集群节点之间的心跳维护,v1.13开始引入
kube-public Active 45h # 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system Active 45h # 所有由Kubernetes系统创建的资源都处于这个命名空间
k8s的最小单元是pod,容器必须跑在pod,k8s通过pod控制器控制pod。
k8s在集群启动之后,各个组件也是通过pod的方式运行的。
corends,集群内通信。
etcd,存储对象资源。
apiserver,控制器入口。
controller-manage:决定pod在哪台运行。
scheduler,调度,
还有flannel网络,
以及proxy代理访问Pod等等。
一个Pod里面一般至少有两个容器,一个跟容器,不会计算在内。这个的意思 就是pod里面全部有一个容器,准备完毕的有1个。根容器不会计算在内。
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev
deployment.apps/nginx created
kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 2m15s
kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-64777cd554-vvhdf 1/1 Running 0 3m4s 10.244.1.17 node1
k8s中。pod是最小的控制单元,但是k8s不直接控制pod,而是通过一些pod控制器,如deployment,他会生成级联对象descrplate,由级联对象来控制pod.
kubectl run nginx --image=nginx:1.17.1 --prot=80 --replicas=5 -n dev
[root@master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-64777cd554-2hcgb 1/1 Running 0 10s 10.244.2.29 node2
nginx-64777cd554-6btr6 1/1 Running 0 10s 10.244.2.28 node2
nginx-64777cd554-dtbff 1/1 Running 0 10s 10.244.1.21 node1
nginx-64777cd554-qpdcm 1/1 Running 0 10s 10.244.1.19 node1
nginx-64777cd554-rwxbk 1/1 Running 0 10s 10.244.1.20 node1
[root@master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-64777cd554-2hcgb 1/1 Running 0 37s pod-template-hash=64777cd554,run=nginx
nginx-64777cd554-6btr6 1/1 Running 0 37s pod-template-hash=64777cd554,run=nginx
nginx-64777cd554-dtbff 1/1 Running 0 37s pod-template-hash=64777cd554,run=nginx
nginx-64777cd554-qpdcm 1/1 Running 0 37s pod-template-hash=64777cd554,run=nginx
nginx-64777cd554-rwxbk 1/1 Running 0 37s pod-template-hash=64777cd554,run=nginx
[root@master ~]#
[root@master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-64777cd554-22jzc 1/1 Running 0 9s 10.244.2.30 node2
nginx-64777cd554-2dlfh 1/1 Running 0 9s 10.244.1.23 node1
nginx-64777cd554-c9wmw 1/1 Running 0 9s 10.244.2.31 node2
nginx-64777cd554-fbfpm 1/1 Running 0 9s 10.244.1.22 node1
nginx-64777cd554-tx29r 1/1 Running 0 9s 10.244.1.24 node1
[root@master ~]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 5/5 5 5 21s nginx nginx:1.17.1 run=nginx
pod在重建过程中,Pod IP是会改变的。并且集群外部无法访问Pod Ip
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx --type=ClusterIP --port=80 --target-port=80 -n dev
service/svc-nginx exposed
[root@master ~]# kubectl get service -n dev -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx ClusterIP 10.110.68.30 80/TCP 9s run=nginx
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx --type=NodePort --port=80 --target-port=80 -n dev
service/svc-nginx exposed
[root@master ~]# kubectl get service -n dev -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx NodePort 10.109.27.97 80:30692/TCP 2s run=nginx