Kubernetes的基础操作
# Kubernetes的基础操作
# Kubernetes的版本
versi命令
[root@master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.1", GitCommit:"7879fc12a63337efff607952a323df90cdc7a335", GitTreeState:"clean", BuildDate:"2020-04-08T17:38:50Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.1", GitCommit:"7879fc12a63337efff607952a323df90cdc7a335", GitTreeState:"clean", BuildDate:"2020-04-08T17:30:47Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
# Kubeadm reset
[root@master ~]# kubeadm reset 清空实验环境
# Kubeadm init
kubeadm init做了哪些工作?
[root@master ~]# kubeadm init 部署实验环境
[preflight] 环境检查和拉取镜像(kubeadm config images pull)
[certs] 创建证书目录/etc/kubernetes/pki,生成证书
[kubeconfig] 创建连接apiserver的配置文件目录/etc/kubernetes
[kubelet-start] 生成kubelet配置文件和启动
[control-plane] 使用静态pod启动master组件 /etc/kubernetes/manifests
[upload-config] [upload-certs] [kubelet] 使用 ConfigMap 存储kubelet配置
[mark-control-plane] 给master节点添加标签
[bootstrap-token] kubelet自动申请证书机制
[addons] 安装插件CoreDNS和kube-proxy
# 为什么部署CNI网络组件?
- Q1: 两边的容器ip是一样的
- Q2: 容器1访问容器2,容器1怎么知道容器2在哪个docker主机?
- Q3: 容器1访问容器2数据包是怎么传输过去的?
验证结果
使用docker run运行一个nginx,并且查看容器的IP地址
[root@master ~]# docker run -d --name nginx nginx:latest
a1a0846b2fbc01ac7a6dc5a67b0c37545386d8689f38bdb6e9251048f22ca200
[root@master ~]# docker inspect nginx
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "4f998a89be2f45e879a9d33ab040bb0f71725a0a16b865225156fd3b101bb68f",
"EndpointID": "6a24ce452aa44fa4fbd3111902829aeaa1b56fcf0086aff32855e6a00a0cdec9",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2", #ip地址
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
访问容器内的地址
master和node节点都能访问
[root@master ~]# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.089 ms
[root@node ~]# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.371 ms
# K8s的 CNI网络模型
K8s是一个扁平化网络
即所有部署的网络组件都必须满足如下要求:
- 一个Pod一个IP
- 所有的Pod可以与任何其他Pod直接通信
- 所有节点可以与所有Pod直接通信
- Pod内部获取到的IP地址与其他Pod或节点与其他通信的IP地址是同一个
- 主流的网络组件有: Flannel Calico等
# 结论
在相同的网络中没有指定docker的网络的情况下,可以通过访问容器的ip地址 可以查看到是在哪个docker的主机上面。
容器1访问容器2的数据包的时候 可以做路由互相访问
# kubeconfig的配置文件
# kubectl的使用
在master节点上面可以使用kubectl命令
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 130m v1.18.1
node Ready <none> 94m v1.18.1
但是在node节点上面会报错 显示没有port或者直接error
[root@node ~]# kubectl get node
error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
只需要将master节点的/root/.kube/config 拷贝到node节点
[root@master ~]# scp /root/.kube/config root@node:~
config 100% 5454 2.0MB/s 00:00
[root@node ~]# mkdir .kube
[root@node ~]# mv config .kube/
[root@node ~]# kubectl get nodes
' NAME STATUS ROLES AGE VERSION
master Ready master 129m v1.18.1
node Ready <none> 93m v1.18.1
# 使用--kubeconfig
在node节点上面使用kubectl命令的时候可以指定kubeconfig的路径
[root@node ~]# mv /root/.kube/config /tmp/
[root@node ~]# kubectl get nodes
'error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
[root@node ~]# kubectl --kubeconfig=/tmp/config get node
NAME STATUS ROLES AGE VERSION
master Ready master 136m v1.18.1
node Ready <none> 99m v1.18.1
# completion命令
kubectl工具自动补全,source < (kubectl completion bash) (依赖软件包bash-completion)
使用kubectl命令的时候可以tab健补齐命令
[root@master ~]# yum install -y bash-completion
[root@master ~]# source /usr/share/bash-completion/bash_completion
[root@master ~]# bash
[root@master ~]# source <( kubectl completion bash)
# Kubernetes将弃用Docker
在Kubernetes平台中,为了解决与容器运行时,(例如Docker)集成问题,在早期社区推出CRI(Container Runtime Interface,容器运行时接口),以支持更多的容器运行时。
Kubernetes计划弃用就是kubelet中dockershim。即Kubernetes kubelet实现中的组件之一,它能够与Docker Engine进行通信。
# 为什么这么做?
Docker内部调用链比较复杂,多层封装和调用,导致性能降低,提升故障率,不易排查。
Docker还会在宿主机创建网络规则,存储卷,也带来了安全隐患。
# 如何应对?
在未来的Kubernetes版本彻底放弃Docker支持之前,引入受支持的容器运行时。
除了docker之外,CRI还支持很多容器运行时,例如:
- containerd: containerd与Docker相互兼容,相比Docker轻量很多,目前比较成熟
- cri-o,podman: 都是红帽(Redhat)项目,目前红帽主推podman
- 在kubernetes V1.20后支持containerd
# 基本资源的概念
Pod
:K8s最小的部署单元,一组容器的集合-Deployment
: 最常见额控制器,用于更高级别部署和管理Pod-Service
: 为一组Pod提供负载均衡,对外提供同一的访问入口-Label
: 标签,附加到某个资源上,用于关联对象,查询和筛选-Namespaces
: 命名空间,将对象逻辑上隔离,也利于权限控制
# 查看容器的日志
[root@master ~]# kubectl logs <容器名称> -n kube-system
[root@master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-d9d48f6bf-8ktqq 1/1 Running 0 48m
coredns-d9d48f6bf-jlhgl 1/1 Running 0 48m
etcd-master 1/1 Running 0 48m
kube-apiserver-master 1/1 Running 0 48m
kube-controller-manager-master 1/1 Running 0 48m
kube-flannel-ds-7fg7n 1/1 Running 0 12m
kube-flannel-ds-jvwsl 1/1 Running 0 48m
kube-proxy-flk2z 1/1 Running 0 48m
kube-proxy-r8ztx 1/1 Running 0 12m
kube-scheduler-master 1/1 Running 0 48m
[root@master ~]# kubectl logs coredns-d9d48f6bf-8ktqq -n kube-system
.:53
[INFO] plugin/reload: Running configuration MD5 = 4e235fcc3696966e76816bcd9034ebc7
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
[ERROR] plugin/errors: 2 8198651563338055206.150263447128682679. HINFO: read udp 10.244.0.3:50822->172.25.254.2:53: i/o timeout
[ERROR] plugin/errors: 2 8198651563338055206.150263447128682679. HINFO: read udp 10.244.0.3:40375->172.25.253.1:53: i/o timeout
[ERROR] plugin/errors: 2 8198651563338055206.150263447128682679. HINFO: read udp 10.244.0.3:39816->172.25.254.2:53: i/o timeout
[ERROR] plugin/errors: 2 8198651563338055206.150263447128682679. HINFO: read udp 10.244.0.3:33657->172.25.254.2:53: i/o timeout
# 查看容器的事件
[root@master ~]# kubectl describe pod <容器名称> -n kube-system
[root@master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-d9d48f6bf-8ktqq 1/1 Running 0 48m
coredns-d9d48f6bf-jlhgl 1/1 Running 0 48m
etcd-master 1/1 Running 0 48m
kube-apiserver-master 1/1 Running 0 48m
kube-controller-manager-master 1/1 Running 0 48m
kube-flannel-ds-7fg7n 1/1 Running 0 12m
kube-flannel-ds-jvwsl 1/1 Running 0 48m
kube-proxy-flk2z 1/1 Running 0 48m
kube-proxy-r8ztx 1/1 Running 0 12m
kube-scheduler-master 1/1 Running 0 48m
[root@master ~]# kubectl describe pods etcd-master -n kube-system
# 查看资源标签
查看pod的标签
NAME READY STATUS RESTARTS AGE LABELS
web-756987f8f4-8rwwp 1/1 Running 0 40m app=web,pod-template-hash=756987f8f4
查看service的标签
可以发现pod和service的标签app=web的,所以service才对web的pod生效。
[root@master ~]# kubectl get service --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12h component=apiserver,provider=kubernetes
web NodePort 10.99.251.101 <none> 80:30746/TCP 16m app=web
查看筛选的标签
[root@master ~]# kubectl get deployment -n aliang-cka
NAME READY UP-TO-DATE AVAILABLE AGE
pod-1 1/1 1 0 8m21s
# 命名空间
命名空间(Namespace):Kubernetes将资源对象逻辑上隔离,从而形成多个虚拟集群。
应用场景:
- 根据不同的团队划分命名空间
- 根据项目划分命名空间
kubectl get namespace:
- default: 默认命名空间
- kube-system: k8s系统方面的命名空间
- kube-public: 公开的命名空间,谁都可以访问
- kube-node-lease: k8s内部命名空间
两种方法指定资源命名空间:
- 命令行加 -n
- yaml资源元数据里面指定namespace字段
# namespace命令
查看命名空间
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 12h
kube-node-lease Active 12h
kube-public Active 12h
kube-system Active 12h
kubernetes-dashboard Active 12h
# 创建Namespace
不要害怕创建namespace。它不会降低服务的性能,反而大多情况下会提升你的工作效率。 创建namespace只需一个很简单的命令,例如,创建一个名字为:test的namespace,执行:
[root@master ~]# kubectl create namespace test
[root@master ~]# cat test.yaml
kind: Namespace
apiVersion: v1
metadata:
name: test
labels:
name: test
查看命名空间
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 12h
kube-node-lease Active 12h
kube-public Active 12h
kube-system Active 12h
kubernetes-dashboard Active 12h
test Active 1ms