K8S 基础部分

  • 1. 概念
  • 2. 历史和特征
  • 3. 架构
  • 3.1 组件架构解析
  • 3.1.2 控制平面组件
  • 3.1.3 Node 组件
  • 3.2 任务架构演示
  • 3.3 集群部署架构
  • 4. Kubeadm创建集群
  • 4.1 安装Kubeadmn
  • 4.1.1 基础环境和配置
  • 4.1.2 安装kubelet、kubeadm、kubectl
  • 4.2 使用kubeadm引导集群
  • 4.2.1 下载镜像
  • 4.2.2 初始化主节点
  • 4.2.3 执行初始化之后的提示信息
  • 4.2.4 安装网络组件 (坑多)
  • 4.2.5 加入工作节点
  • 4.3 测试集群自我修复能力
  • 4.4 部署Dashboard
  • 4.4.1 拉取文件进行配置
  • 4.4.2 问题解决
  • 4.4.3 生成token
  • 4.4.4 知识扩展(重点)
  • 5. NameSpace
  • 5.1 get命令介绍
  • 5.2 测试创建和删除命名空间
  • 5.2.1 命令行方式
  • 5.2.2 yaml文件方式
  • 6. Pod
  • 6.1 理解Pod
  • 6.2 体验创建一个Pod
  • 6.2.1 命令行方式
  • 6.2.2 yaml文件方式
  • 6.2.3 dasdboard可视化方式
  • 6.3 其他命令
  • 6.3.1 运行日志和分配的IP
  • 6.3.2 查看分配到哪个节点了
  • 6.3.3 进入Pod修改nginx文件
  • 6.3.4 Pod的多容器
  • 7. 空间使用情况
  • 8. 相关文件和卸载
  • 8.1 卸载Kubernetes
  • 8.2 calico.yaml
  • 8.3 dashboard.yaml


1. 概念

k8s是什么?

从logo来看,是Docker的掌舵者

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程

2. 历史和特征

Google编写并开源的,10年容器化基础架构的经验

特点

1、轻量级,采用Go语言编写,消耗资源小;

2、弹性伸缩,云原生提到的可持续性交付

3、负载均衡;

详细特征

  • 服务发现和负载均衡
    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
  • 存储编排
    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
  • 自动部署和回滚
    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
  • 自动完成装箱计算
    Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
  • 自我修复
    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
  • 密钥与配置管理
    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

3. 架构

3.1 组件架构解析

kubernetes菜鸟教程 kubernetes基础_容器_02

详细描述具体概念:

3.1.2 控制平面组件

控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的 replicas 字段时,启动新的 pod)。控制平面组件可以在集群中的任何节点上运行。

  • kube-apiserver:该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。kube-apiserver 设计上考虑了水平伸缩,也就是说,它可通过部署多个实例进行伸缩。 可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量
  • etcd:etcd 是兼具一致性高可用性键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
  • kube-scheduler:控制平面组件,负责监视新创建的、未指定运行节点node的 Pods,选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
  • kube-controller-manager:在主节点上运行控制器的组件。从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。这些控制器包括:
  • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
  • 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
  • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
  • cloud-controller-manager:云控制器管理器是指嵌入特定云的控制逻辑的控制平面组件。cloud-controller-manager 仅运行特定于云平台的控制回路。 如果在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的环境中不需要云控制器管理器。与 kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的控制回路组合到同一个可执行文件中,供以同一进程的方式运行。 可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。
3.1.3 Node 组件

节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

  • kubelet:一个在集群中每个节点node上运行的代理。它保证容器containers都运行在Pod中。
  • kube-proxy:是集群中每个节点上运行的网络代理, 实现 Kubernetes Service 概念的一部分。kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。

3.2 任务架构演示

kubernetes菜鸟教程 kubernetes基础_kubernetes_03

3.3 集群部署架构

kubernetes菜鸟教程 kubernetes基础_docker_04

4. Kubeadm创建集群

前提是每个主机都安有DockerLinux安装Docker传送门

后面有卸载Kubernetes步骤

配置当前Linux网络的时候,不论是云服务器还是本地虚拟机,记得不要写192.168.0.0和172.17.0.0 的,一个是calico一个是docker,不然后面得防止占用需要修改文件

4.1 安装Kubeadmn

前提事项

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
  • 设置不同hostname
  • 开启机器上的某些端口。内网互信
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
4.1.1 基础环境和配置
1、各个机器设置自己的域名  cluster-master    cluster-node1   cluster-node2
hostnamectl set-hostname cluster-master 

2、将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0  # 临时关闭
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config   # 永久关闭

3、关闭swap
swapoff -a  # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久关闭
关闭之后查看,要使得swap和后面都是0

这是腾讯云的,2核2G

kubernetes菜鸟教程 kubernetes基础_容器_05

这是虚拟机的,3核3G

kubernetes菜鸟教程 kubernetes基础_Pod_06

4、允许 iptables 检查桥接流量,K8S官方要求的
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system
4.1.2 安装kubelet、kubeadm、kubectl
1、配置yum源下载K8S
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

结果:
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl


2、安装三大件:kubelet、kubeadm、kubectl 注意版本
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

自启并现在就启动
sudo systemctl enable --now kubelet

在主节点 键入 systemctl status kubelet ,会不停切换启动和停止状态。kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。

kubernetes菜鸟教程 kubernetes基础_容器_07

至此,准备环境搭建好了

4.2 使用kubeadm引导集群

4.2.1 下载镜像

(每台都这样)

sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF

# ls 可以看到images.sh
[root@cluster-master ~]# ls
anaconda-ks.cfg  images.sh


# 赋权并下载镜像
chmod +x ./images.sh && ./images.sh

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_08

kubernetes菜鸟教程 kubernetes基础_Pod_09

4.2.2 初始化主节点
1、所有机器添加master域名映射,以下IP和节点名字需要修改为自己的
ip addr查看
[root@cluster-master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:74:ad:ef brd ff:ff:ff:ff:ff:ff
    inet 192.76.116.201/24 brd 192.76.116.255 scope global noprefixroute ens33  # 这里就是本机的IP
       valid_lft forever preferred_lft forever
    inet6 fe80::633a:110a:7f35:2713/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:f0:76:df:55 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0   # 这里是给docker分的IP
       valid_lft forever preferred_lft forever

每个节点都执行
echo "192.76.116.201 cluster-endpoint" >> /etc/hosts

2、主节点初始化(只在主节点运行!!!)
kubeadm init \
--apiserver-advertise-address=192.76.116.201 \  # master节点的IP
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \     # 不用改
--pod-network-cidr=192.168.0.0/16   # 最好不改

无注释版
kubeadm init \
--apiserver-advertise-address=192.76.116.201 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

#所有网络范围不重叠

3、复制保留之后出来的界面的信息(含有token和提示添加pod网络的信息)

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

# 加入master节点
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join cluster-endpoint:6443 --token ls3xy7.7cl3pv1paz0tgzx3 \
    --discovery-token-ca-cert-hash sha256:c676fa63e72c118635cef85d137ae7f93c2d3ca21d67b79c3ba2f4bbb5aec90f \
    --control-plane 

# 加入worker节点
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join cluster-endpoint:6443 --token ls3xy7.7cl3pv1paz0tgzx3 \
    --discovery-token-ca-cert-hash sha256:c676fa63e72c118635cef85d137ae7f93c2d3ca21d67b79c3ba2f4bbb5aec90f
4.2.3 执行初始化之后的提示信息
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

相关命令查阅

#查看集群所有节点
[root@cluster-master ~]# kubectl get nodes
NAME             STATUS     ROLES                  AGE   VERSION
cluster-master   NotReady   control-plane,master   46s   v1.20.9
# 因为当前没有网络插件,上面的信息中提到了如下:
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
  
# 根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml

# 看集群部署了哪些应用
docker ps   ===   kubectl get pods -A
# 运行中的应用在docker里面叫容器,在k8s里面叫Pod
kubectl get pods -A
4.2.4 安装网络组件 (坑多)

关闭一下防火墙:systemctl disable firewalld --now

curl https://docs.projectcalico.org/manifests/calico.yaml -O
用下面这个,上面的可能大概也许会因为版本问题报错
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O

cat calico.yaml |grep 192.168 #  查看配置文件这个信息,如果之前在第二步初始化主节点的时候修改过,这里要改成对应的IP
有信息再使用下面这个
kubectl apply -f calico.yaml

kubernetes菜鸟教程 kubernetes基础_docker_10

问题:cat搜索之后不显示,或者curl: (35) Encountered end of file

解决:关闭一下防火墙:systemctl disable firewalld --now

问题

解决:参考

查看K8S版本
[root@cluster-master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.9", GitCommit:"7a576bc3935a6b555e33346fd73ad77c925e9e4a",GitTreeState:"clean", BuildDate:"2021-07-15T21:01:38Z", GoVersion:"go1.15.14", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.9", GitCommit:"7a576bc3935a6b555e33346fd73ad77c925e9e4a",GitTreeState:"clean", BuildDate:"2021-07-15T20:56:38Z", GoVersion:"go1.15.14", Compiler:"gc", Platform:"linux/amd64"}

修改yaml文件参考,文末也有

问题:报错Init:0/3

解决:镜像版本不一致

再次测试集群所有节点

[root@cluster-master ~]# kubectl get nodes
NAME             STATUS   ROLES                  AGE    VERSION
cluster-master   Ready    control-plane,master   161m   v1.20.9

kubectl get pods -A
4.2.5 加入工作节点

使用第二步得到的信息,join worker的信息,在node1和node2上运行

kubeadm join cluster-endpoint:6443 --token ls3xy7.7cl3pv1paz0tgzx3 \
    --discovery-token-ca-cert-hash sha256:c676fa63e72c118635cef85d137ae7f93c2d3ca21d67b79c3ba2f4bbb5aec90f

如果令牌过期了,键入以下命令

kubeadm token create --print-join-command

再使用kubectl get nodes即可查看,当然这需要等一等

kubectl get pods -A

问题:[ERROR FileContent–proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1

解决:这个是因为安装master节点时环境准备没有做好:按照下列操作

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720         
EOF
sysctl --system

成功加入集群

kubernetes菜鸟教程 kubernetes基础_Pod_11

查看主节点的nodes和pods

kubernetes菜鸟教程 kubernetes基础_kubernetes_12

很慢很慢很慢!!!时刻在变化

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_13

问题

一直PodInitializing

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_14

解决思路

kubectl describe pod calico-node-sn7d7 --namespace=kube-system 查看为啥

手动的拉去下载不下来的镜像

再来

kubernetes菜鸟教程 kubernetes基础_kubernetes_15

全部Ready

kubernetes菜鸟教程 kubernetes基础_kubernetes_16

4.3 测试集群自我修复能力

reboot三台主机

重新进master节点主机,键入 kubectl get pods -A,可以看到大多数都是重启了两次

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_17

4.4 部署Dashboard

4.4.1 拉取文件进行配置
1、kubectl apply命令,根据配置文件里面列出来的内容,升级现有的
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

2、设置访问端口   把type: ClusterIP 改为 type: NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

3、显示到端口,在安全组放行
kubectl get svc -A |grep kubernetes-dashboard

访问一下https://ip:端口,出来界面,这个IP端口写工作节点的IP(我试了好久master节点的,不能成功访问)

一定要注意,如果是单机版,则直接master-ip:port即可以访问,如果是云版本,一定到找到pod对应的node,然后浏览器访问 node-ip:port访问。

4.4.2 问题解决

问题:Dashboard的pod状态为CrashLoopBackOff

解决方法二

删除dashboard,好像删不干净,每次apply dashboard的时候会有unchanged的信息,那些就是没删干净的,不过好像不影响,主要是要修改yaml,重新apply
kubectl delete -f dashboard.yaml
kubectl get deployment --all-namespaces
kubectl -n kubernetes-dashboard delete $(sudo kubectl -n kubernetes-dashboard get deployment -o name | grep dashboard)


1、访问这个网页复制页面yaml:https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
文末也有这个文件
vi dashboard.yaml   输入yaml

2、拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1

3、创建服务
kubectl apply -f dashboard.yaml

4、查看pods状态
kubectl get pods -A
下面这两个是running即可
kubernetes-dashboard   dashboard-metrics-scraper-79c5968bdc-sqs8f   1/1     Running   1          11h
kubernetes-dashboard   kubernetes-dashboard-658485d5c7-fctq4        1/1     Running   14         11h

5、查看暴露的端口
[root@cluster-master ~]# kubectl get pods,svc -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-79c5968bdc-sqs8f   1/1     Running   1          11h
pod/kubernetes-dashboard-658485d5c7-fctq4        1/1     Running   14         11h

NAME                                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
service/dashboard-metrics-scraper   ClusterIP   10.96.199.85   <none>        8000/TCP        11h
service/kubernetes-dashboard        NodePort    10.96.96.225   <none>        443:30558/TCP   25m
6、访问https://cluster-node1的IP:30558  即 https://192.76.116.202:30558

kubernetes菜鸟教程 kubernetes基础_kubernetes_18

点“高级”继续访问

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_19

4.4.3 生成token
[root@cluster-master ~]# kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created
[root@cluster-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
[root@cluster-master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
Name:         dashboard-admin-token-zgdbv
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: cffacd35-9cef-40e9-8b43-c2c3009de5d7

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkVqNWhvN2MxT2VTTjRPY1I5ZlVjUTcyUXBMeDg3SDQzZnJVdDUtYkRRaVUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4temdkYnYiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiY2ZmYWNkMzUtOWNlZi00MGU5LThiNDMtYzJjMzAwOWRlNWQ3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.keo3Ryr8uHPCkUDCJBuF_XTTz0SNunVg5rtyDOA0aJOdL1NDCWcKn75aa-ceHvuotRDeLIQ5Yn61Frflu7-foGzaQU2ozyaOCrElukvr3cMA-UXLi1Vzoc39uWAfZBB7z6gAxGUqUBtw53CqXgS668gIAthPYlK8FWwjwGBBbF7zR6YYO3vbEWChJmXGjXBlAht2va36EBYOjzA2liHFLBefCEwB5dBF3Pq-OqVYGn6nKHq29o8siFAMEGGTOna9x3URFzLDsTLnX6qHEHJ4zZtM6SvISs7r569pPDKukCiJeZqhstXRb7cVuXNG8sty-xDK8q58cc732yB8iJH9Pg
ca.crt:     1066 bytes
namespace:  11 bytes

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_20

另外一个生成token的方法是这个,我没测试过:

-- 1、创建访问账号,准备一个yaml文件; vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

-- 2、apply一下
 kubectl apply -f dash.yaml
 
 令牌访问
 #获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

得到的令牌:
4.4.4 知识扩展(重点)

命令解释

# 一般命令的格式会如下:
kubectl get <resource_type>
# 比如获取K8s集群下运行的pod的信息
kubectl get pods  下面有细讲为啥没信息
# 更加详细的信息
kubectl get pod -n kube-system -o wide

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_21

5. NameSpace

5.1 get命令介绍

我们使用kubectl get ns(namespace简写)获取命名空间信息

kubernetes菜鸟教程 kubernetes基础_docker_22

使用kubectl get pods是找不到任何资源的,因为这个是在默认在命名空间“default”里面找部署的容器资源,我们没在这里部署,所以是空的。需要使用kubectl get pods -A,获取所有命名空间的资源

kubernetes菜鸟教程 kubernetes基础_Pod_23

使用 -n 可以指定命名空间查询

kubernetes菜鸟教程 kubernetes基础_Pod_24

默认的这些命名空间不要删(也不允许删)

5.2 测试创建和删除命名空间

5.2.1 命令行方式

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_25

同时,我们在dashboard页面也可以看到这个命名空间


kubernetes菜鸟教程 kubernetes基础_kubernetes_26

删除命名空间

kubernetes菜鸟教程 kubernetes基础_Pod_27

5.2.2 yaml文件方式
[root@cluster-master ~]# vi helloxw.yaml

apiVersion: v1  # 版本
kind: Namespace  # 创建的类型,pod、namespace,以后会有很多
metadata:
  name: helloxw # ns的名字
 
1、创建
[root@cluster-master ~]# kubectl apply -f helloxw.yaml 
namespace/helloxw created

2、查看
[root@cluster-master ~]# kubectl get ns
NAME                   STATUS   AGE
default                Active   15h
helloxw                Active   8s
kube-node-lease        Active   15h
kube-public            Active   15h
kube-system            Active   15h
kubernetes-dashboard   Active   12h

3、删除
# 配置文件创建的东西,使用配置文件删除会删的比较干净
[root@cluster-master ~]# kubectl delete -f helloxw.yaml 
namespace "helloxw" deleted

6. Pod

6.1 理解Pod

Docker中提供容器运行环境CRI,启动创建一个容器,Pod在外面封装一层,管理容器,之后启动停止,我都说对Pod的操作。

Pod:运行中的一组容器,是Kubernetes中应用的最小单位

kubernetes菜鸟教程 kubernetes基础_Pod_28

6.2 体验创建一个Pod

6.2.1 命令行方式
1、创建一个Pod
[root@cluster-master ~]# kubectl run mynginx01 --image=nginx
pod/mynginx01 created

2、查看默认命名空间的pod情况
[root@cluster-master ~]# kubectl get pods
NAME        READY   STATUS              RESTARTS   AGE
mynginx01   0/1     ContainerCreating   0          8s
-- 发现是创建中ContainerCreating

3、查看具体创建过程
[root@cluster-master ~]# kubectl describe pod mynginx01
-- 只关注最后的Events
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  43s   default-scheduler  Successfully assigned default/mynginx01 to cluster-node2
  Normal  Pulling    43s   kubelet            Pulling image "nginx"
  Normal  Pulled     21s   kubelet            Successfully pulled image "nginx" in 21.714805698s
  Normal  Created    20s   kubelet            Created container mynginx01
  Normal  Started    20s   kubelet            Started container mynginx01

4、再次查看
[root@cluster-master ~]# kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
mynginx01   1/1     Running   0          3m32s

5、删除这个Pod
[root@cluster-master ~]# kubectl delete pod mynginx01
pod "mynginx01" deleted
6.2.2 yaml文件方式

vim pod.yaml

注意我写了两个容器

apiVersion: v1
kind: Pod
metadata:
 labels:
  run: myapp
 name: myapp  # Pod名字,要有意义
 namespace: default  # 也可以在这里指定命名空间
 
spec: 
 containers:
  - image: nginx
    name: mynginx  # 容器名字,可以随便写
  - image: tomcat:9  # 多个镜像就多个- image
    name: mytomcat

运行过程

1、执行文件
[root@cluster-master ~]# kubectl apply -f pod.yaml 
pod/myapp created

2、查看pods状态
[root@cluster-master ~]# kubectl get pods
NAME    READY   STATUS              RESTARTS   AGE
myapp   0/2     ContainerCreating   0          13s

3、查看创建过程
[root@cluster-master ~]# kubectl describe pod myapp
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  86s   default-scheduler  Successfully assigned default/myapp to cluster-node2   #  注意这里写了分配到哪个节点
  Normal  Pulling    85s   kubelet            Pulling image "nginx"
  Normal  Pulled     69s   kubelet            Successfully pulled image "nginx" in 15.629518446s
  Normal  Created    69s   kubelet            Created container mynginx
  Normal  Started    69s   kubelet            Started container mynginx
  Normal  Pulling    69s   kubelet            Pulling image "tomcat:9"
  Normal  Pulled     33s   kubelet            Successfully pulled image "tomcat:9" in 35.964557014s
  Normal  Created    33s   kubelet            Created container mytomcat
  Normal  Started    33s   kubelet            Started container mytomcat

4、查看pods状态
[root@cluster-master ~]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
myapp   2/2     Running   0          3m10s
6.2.3 dasdboard可视化方式

kubernetes菜鸟教程 kubernetes基础_kubernetes_29

查看相关信息

IP解释看下面讲的

kubernetes菜鸟教程 kubernetes基础_容器_30

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_31

6.3 其他命令

6.3.1 运行日志和分配的IP

每个Pod - k8s都会分配一个ip,我们这里是192.168.191.196 这个子网是在我们之前4.2.2的时候主节点初始化(只在主节点运行!!!)的时候配置的哟,记得吧,另外Calico默认的也是这个网段

# 查看Pod的运行日志
不需要加pod 因为只有pod有日志
logs -f 可以追踪
kubectl logs Pod名字

# 每个Pod - k8s都会分配一个ip
kubectl get pod -o wide
# 使用Pod的ip+pod里面运行容器的端口
[root@cluster-master ~]# kubectl get pod -o wide
NAME    READY  STATUS  RESTARTS AGE   IP             NODE NOMINATED NODE   READINESS GATES
myapp   2/2     Running   0     6m   192.168.191.196   cluster-node2   <none>     <none>
[root@cluster-master ~]# curl 192.168.191.196
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

# 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod
6.3.2 查看分配到哪个节点了

我们通过kubectl describe pod myapp可以查看调度者帮我们分配到了哪一个节点运行这个Pod

也可以使用docker ps | grep myapp 在每一台主机上键入来查看哪一个有myapp

kubernetes菜鸟教程 kubernetes基础_kubernetes菜鸟教程_32

6.3.3 进入Pod修改nginx文件
# 进入Pod的容器,和docker差不多,但是需要加 -- /bin/bash
[root@cluster-master ~]# kubectl exec -it myapp -- /bin/bash
# 因为我这里装了两个容器在pod里面,默认进的是mynginx
Defaulting container name to mynginx.
Use 'kubectl describe pod/myapp -n default' to see all of the containers in this pod.

root@myapp:/# ls
bin   dev		   docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc			 lib   media  opt  root  sbin  sys  usr

# 修改文件
root@myapp:/usr/share/nginx/html# echo "xiaowei coming here!" > index.html 
root@myapp:/usr/share/nginx/html# cat index.html 
xiaowei coming here!

# 测试访问Success
[root@cluster-node2 ~]# curl http://192.168.191.196
xiaowei coming here!

ps:在dashboard里面也可以进入容器修改文件
6.3.4 Pod的多容器

k8s会给Pod分配一个IP,那么整个集群里的机器就可以通过这个IP来访问这个Pod里的容器,

Pod里的容器是可以互通的,因为相对来说是在一个网络下,所以使用127.0.0.1访问即可

# 进入Pod里默认的mynginx容器
[root@cluster-master ~]# kubectl exec -it myapp -- /bin/bash
Defaulting container name to mynginx.
Use 'kubectl describe pod/myapp -n default' to see all of the containers in this pod.

# 测试访问mynginx Success
root@myapp:/# curl 127.0.0.1 
xiaowei coming here!

# 测试访问mytomcat Success
root@myapp:/# curl 127.0.0.1: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/9.0.56</h3></body></html>

图解

kubernetes菜鸟教程 kubernetes基础_kubernetes_33

7. 空间使用情况

至此,基础部分就结束了,我们看看每个主机的空间使用情况

这是起初的

kubernetes菜鸟教程 kubernetes基础_Pod_06

这是之后的

kubernetes菜鸟教程 kubernetes基础_Pod_35

因为master作为主节点,所以占用的很多,

因为调度者scheduler把任务分在了node2上,所以占用的多

8. 相关文件和卸载

8.1 卸载Kubernetes
yum remove -y kubelet kubeadm kubectl
 
kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd