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的掌舵者
2. 历史和特征
Google10年容器基础设施编写开源经验
:
1、轻量级,采用Go语言编写,资源消耗小;
2、弹性伸缩,云原生提到的;
三、负载均衡;
:
- Kubernetes 可以使用 DNS 名字或自己的 IP 如果进入容器的流量很大, Kubernetes 网络流量,分配网络流量,使部署稳定。
- Kubernetes 允许您自动挂载您选择的存储系统,如本地存储、公共云提供商等。
- 你可以使用 Kubernetes 描述已部署容器的所需状态,它可以控制实际状态的速率 将其改为预期状态。例如,您可以自动化 Kubernetes 为您的部署创建新容器, 删除现有容器,并将其所有资源用于新容器。
- Kubernetes 允许您指定每个容器所需的 CPU 和内存(RAM)。 当容器指定资源请求时,Kubernetes 管理容器资源可以做出更好的决策。
- Kubernetes 重启失败的容器,替换容器,杀死不响应用户定义的容器 检查运行状态的容器在准备服务前不会通知客户端。
- Kubernetes 允许您存储和管理敏感信息,如密码OAuth 令牌和 ssh 密钥。 您可以部署和更新密钥和应用程序配置,而无需重建容器镜像,也无需在堆栈配置中暴露密钥。
3. 架构
3.1 组件架构分析
具体概念的详细描述:
3.1.2 控制平面组件
控制平面的组件为集群制作(如调度),以及对集群事件的检测和响应(例如,当不满足部署时 replicas
开始新的字段 pod)。控制平面组件可以在集群中的任何节点上运行。
- :组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面前端。kube-apiserver 考虑设计,也就是说,它可以通过部署多个实例来伸缩。 可以运行 kube-apiserver 多个例子,在这些例子之间。
- :etcd 是兼具和的,可作为保存 Kubernetes 所有集群数据的背景数据库。
- :控制平面组件,监控新创建的未指定操作节点node的 Pods,选择节点让 Pod 在上面操作。包括单个因素 Pod 和 Pod 资源需求、硬件/软件/策略约束、亲和力和反亲和力规范、数据位置、工作负荷之间的干扰和最终时限。
- :控制器的组件在主节点上运行。从逻辑上讲,每个控制器都是一个单独的过程, 但为了降低复杂性,它们都被编译成相同的可执行文件,并在同一过程中运行。这些控制器包括:
- 节点控制器(Node Controller): 节点故障时负责通知和响应
- 任务控制器(Job controller): 监测代表一次性任务的监测 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入) Service 与 Pod)
- 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认账户和 API 访问令牌
3.1.3 Node 组件
节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。
-
kubelet :一个在集群中每个节点node上运行的代理。它保证容器containers都运行在Pod中。 -
kube-proxy :是集群中每个节点上运行的网络代理 , 实现 Kubernetes Service 概念的一部分。kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
3.2 任务架构演示
3.3 集群部署架构
4. Kubeadm创建集群
前提是每个主机都安有DockerLinux安装Docker传送门
后面有
配置当前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
这是虚拟机的,3核3G
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 指令的死循环。
至此,准备环境搭建好了
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
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
查看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文件参考https://blog.csdn.net/moyuanbomo/article/details/123092448,文末也有
参考文章CSDN博客 https://blog.csdn.net/cuichongxin/article/details/121615068
[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
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
成功加入集群
查看主节点的nodes和pods
很慢很慢很慢!!!时刻在变化
参考:Kubernetes Pod 提示 : Init:ImagePullBackOff_WANGMCHAO的博客-CSDN博客
一直PodInitializing
kubectl describe pod calico-node-sn7d7 --namespace=kube-system 查看为啥
手动的拉去下载不下来的镜像
再来
全部Ready
4.3 测试集群自我修复能力
reboot
三台主机
重新进master节点主机,键入 kubectl get pods -A
,可以看到
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,好像删不干净,每次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
点“高级”继续访问
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
另外一个生成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
5. NameSpace
5.1 get命令介绍
我们使用kubectl get ns
(namespace简写)获取命名空间信息
使用kubectl get pods
是找不到任何资源的,因为这个是在默认在命名空间“default”里面找部署的容器资源,我们没在这里部署,所以是空的。需要使用kubectl get pods -A
,获取所有命名空间的资源
使用 -n 可以
默认的这些命名空间不要删(也不允许删)
5.2 测试创建和删除命名空间
5.2.1 命令行方式
同时,我们在dashboard页面也可以看到这个命名空间
删除命名空间
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:运行中的
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可视化方式
查看相关信息
IP解释看下面讲的
6.3 其他命令
6.3.1 运行日志和分配的IP
每个Pod - k8s都会分配一个ip,我们这里是192.168.191.196 这个子网是在我们之前4.2.2的时候主节点初始化(只在主节点运行!!!)的时候配置的哟,记得吧,另外
# 查看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
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里的容器是可以互通的,因为
# 进入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>
7. 空间使用情况
至此,基础部分就结束了,我们看看每个主机的空间使用情况
因为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
8.2 calico.yaml
文件太长了,[点我查看](云原生笔记/资源文件/calico.yaml · BlueCestbon/Typroa笔记 - 码云 - 开源中国 (gitee.com))