部署dashboard
kubernetes仪表板是kubernetes集群通用、基于web的UI。它允许用户管理集群中允许的应用程序并对其进行故障排除,以及管理集群本身。
#下载k8s yaml文件
[root@master01 ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml
#修改网络配置信息
[root@master01 ~]# vi recommended.yaml
在45行左右的位置添加
type: NodePort
创建资源,访问测试
[root@master01 ~]# kubectl create -f recommended.yaml
#检查状态
[root@master01 ~]# kubectl -n kubernetes-dashboard get po
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-7b8b58dc8b-2fc7d 1/1 Running 0 115s
kubernetes-dashboard-866f987876-fgw4h 1/1 Running 0 115s
#查看所有pod
[root@master01 ~]# kubectl get po -o wide -A --watch
#容器正确运行后,测试访问,查看service资源
[root@master01 ~]# kubectl -n kubernetes-dashboard get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.97.28.219 <none> 8000/TCP 12m
kubernetes-dashboard NodePort 10.103.122.5 <none> 443:32368/TCP 12m
#可以查看到dashboard暴露的端口是443:32368
此时宿主机可以改端口
[root@master01 ~]# netstat -tunlp|grep 32368
tcp6 0 0 :::32368 :::* LISTEN 3786/kube-proxy
注意访问必须是https协议 ,注意使用火狐浏览 器登录,其他浏览器不信任证书
创建账户访问dashboard
[root@master01 ~]# vi admin.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kubernetes-dashboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kubernetes-dashboard
[root@master01 ~]# kubectl create -f admin.yaml
clusterrolebinding.rbac.authorization.k8s.io/admin created
serviceaccount/admin created
#获取令牌,用于登录dashboard
[root@master01 ~]# kubectl -n kubernetes-dashboard get secret |grep admin-token
admin-token-9qsd4 kubernetes.io/service-account-token 3 2m13s
根据如下命令,获取token,注意修改secret的名字
[root@master01 ~]# kubectl -n kubernetes-dashboard get secret admin-token-9qsd4 -o jsonpath={.data.token}|base64 -d
将生成的token填入dashboard
kubectl命令
kubectl get 查询资源
[root@master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master01 Ready master 10d v1.16.2
node01 Ready <none> 10d v1.16.2
note02 Ready <none> 10d v1.16.2
[root@master01 ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
learn-nginx 1/1 1 1 10d
[root@master01 ~]# kubectl get replicaset
NAME DESIRED CURRENT READY AGE
learn-nginx-579f654956 1 1 1 10d
kubectl run 创建容器
kubectl run 资源(deploy)名称 -i -t --image=镜像名称:标签
kubectl run add-nginx -i -t --image=nginx:alpine
安装kubernetes网络组件-Calico
Calico是一种容器之间互通的网络方案。在虚拟化平台中,比如OpenStack,docker等都需要实现workloads之间互联,但同时也需要对容器做隔离控制。而在多数的虚拟化平台实现中,通常都使用二层隔离技术来实现容器的网络,这些网络技术有一些弊端,比如需依赖VLAN,bridge和隧道等技术,其中bridge带来复杂性,VLAN隔离和tunnel隧道在拆包或者加包头市,则消耗更多的资源并对物理环境也有要求。随着网络规模的增大,整体会更加复杂。
Calico 把主机当做Internet中的路由器,使用BGP同步路由,并使用iptables来做安全访问策略。
设计思路:Calico不使用隧道或NAT来实现转发,而是巧妙地把所有的二三层流量转换成三层流量,并通过主机上路由配置完成夸主机转发。
k8s 组网方案对比
flannel方案︰需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标Pod的node节点上。目标node节点再负责去掉封装,将去除封装的数据包发送到目标Pod 上。数据通信性能则大受影响。
Overlay方案∶在下层主机网络的上层,基于隧道封装机制,搭建层叠网络,实现跨主机的通信,Overlay无疑是架构最简单清晰的网络实现机制,但数据通信性能则大受影响。
Calico方案:在k8s多个网路解决方案中选择了延迟表现最好的-calico方案。
总结:Flannel网络非常类似于Docker网络的Overlay驱动,基于二层的层叠网络。
层叠网络的优势:
1.对底层网络依赖较少,不管底层是物理网络还是虚拟网络,对层叠网络的配置管理影响较少;
⒉.配置简单,逻辑清晰,易于理解和学习,非常适用于开发测试等对网络性能要求不高的场景。
层叠网络的劣势:,
1.网络封装是一种传输开销,对网络性能会有影响,不适用于对网络性能要求高的生产场景;
2由于对底层网络结构缺乏了解,无法做到真正有效的流量工程控制,也会对网络性能产生影响;3.某些情况下也不能完全做到与下层网络无关,例如隧道封装会对网络的MTU限制产生影响。
Calico是非层叠网络
Calico 网络的优势:
1.没有隧道封装的网络开销;
⒉.相比于通过Overlay构成的大二层层叠网络,用iBGP构成的扁平三层网络扩展模式更符合传统IP网络的分布式结构;·
3.不会对物理层网络的二层参数如MTU引入新的要求。
Calico 网络的劣势:
1.最大的问题是不容易支持多租户,由于没有封装,所有的虚拟机或者容器只能通过真实的IP来区分自己,这就要求所有租户的虚拟机或容器统一分配一个地址空间;而在典型的支持多租户的网络环境中,每个租户可以分配自己的私有网络地址,租户之间即使地址相同也不会有冲突;
⒉.不容易与其他基于主机路由的网络应用集成。·
公司自用的话calico一般比较合适,公共的可以选择flannel。
安装Calico网络组件
使用yaml安装,下载calico.yaml
#安装
kubectl apply -f /root/calico.yaml
#查看
kubectl get pod --all-namespaces
k8s调度实践演示
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: 1Gi
cpu: 1
requests:
memory: 256Mi
cpu: 100m #1000m=1个cpu 100m为0.1个cpu
requests:在调度器调度的时候会解读pod的requests,requests的语义就是说最少需要这么多资源,如果节点不满足就不会调度过去。limits是给cgroup用的,表示最大占用多少资源,由cgroup来进行配额。