Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。
每次各个节点上当然都要运行Docker,Docker来负责所有具体的映像下载和容器运行。
Kubernetes主要由以下几个核心组件:
1, etcd 保存了整个集群的状态;
2, apiserver 提供了资源操作的唯一入口,并提供认证,授权,访问控制,API注册和发现等机制;
3, controller manager负责维护集群的状态,比如故障检测,自动扩展,滚动更新等;
4, scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
5, kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
6, Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
7, kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负责均衡;
除了核心组件,还有一些推荐的Add-ons:
1, kube-dns 负责为整个集群提供DNS服务
2, Ingress Controller为服务提供外网入口
3, Heapster 提供资源监控
4, Dashboard 提供 GUI
5, Federation 提供跨可用区的集群
6, Fluentd-elasticsearch提供集群日志采集,存储与查询
Kubernetes设计理念和功能其实就是一个类似 Linux 的分层架构
1, 核心层: Kubernetes 最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
2, 应用层: 部署(无状态应用,有状态应用,批处理任务,集群应用等)和路由(服务发现,DNS解析等)
3, 管理层: 系统质量(如基础设施,容器和网络的度量),自动化(如自动扩展,动态Provision等)以及策略管理(RBAC,Quota,PSP,NetworkPolicy等)
4, 接口层: kubectl 命令行工具,客户端SDK以及集群联邦
5, 生态系统: 在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范围:
a, Kubernetes外部: 日志,监控,配置管理,CI,CD,Workfow,FaaS,OTS应用,CharOps等
b, Kubernetes内部: CRI,CNI,CVI,镜像仓库,Cloud Provider,集群自身的配置和管理等
1.2.1 Cluster
Cluster 是计算,存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用
Kubernetes Cluster 由 Master和Node组成,节点上运行着若干 Kubernetes 服务
1.2.1 Master
Master 主要职责是调度,即决定将应用放在哪运行, Master 运行 Linux 系统,可以是物理机或虚拟机, Master 是 Kubernetes Cluster 的大脑, 运行着的 Daemon 服务包括 kube-apiserver,kube-scheduler,kuber-controller-manager,etcd和Pod网络
1, API Server(kube-apiserver)
API Server 提供 HTTP/HTTPS RESTful API即Kubernetes里所有资源的CRUD等操作的唯一入口,也就是集群控制的入口进程
2, Scheduler(kube-scheduler)
Scheduler 负责资源调度的里程,简单说,他决定将 Pod 放在哪个 Node 上运行
3, Controller Manager(kube-controller-manager)
所有资源对象的自动化控制中心,Controller Manager负责管理Cluster各种资源。保证资源处于预期的状态。Controller Manager有多种,如replication controller,endpoints controller,namespace controller,serviceaccounts controller等。
不同的controller管理不同的资源,如replication controller管理Deployment,StatefulSet,DaemonSet的生命周期,namespace controller管理Namespace资源
4, etcd
etcd 负责保存 kubernetes Cluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速地通知Kubernetes相关组件
5, Pod网络
Pod 要能够相互通信, Kubernetes Cluster必须部署 Pod 网络,flannel是其中一个可选方案。
1.2.2 Node
除了 Master,Kubernetes集群中的其他机器被称为Node节点。Node职责是运行容器应用,Node由 Master 管理,Node 负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。Node也运行在 linux系统,可以是物理机或虚拟机。
每个Node节点上都运行着以下一组关键进程
1, kubelet
负责Pod对应的容器的创建,启动等任务,同时与Master节点密切协作,实现集群管理的基本功能
2, kube-proxy
实现 Kubernetes Service 的通信与负载均衡机制的重要组件
3, Docker Enginer
Docker 引擎,负责本机的容器创建和管理工作
1.2.3 Pod
Pod是Kubernetes的最小单元,也是最重要和最基本的概念,每一个Pod包含一个或多容器,Pod 的容器会作为一个整体被Master调度到一个Node上运行,Kubernetes为每个Pod都分配了唯一的IP地址,称为PodIP,一个Pod里的多个容器共享PodIP地址。在Kubernetes里,一个pod里的容器与另外主机上的Pod容器能够直接通信。
1.2.4 Service
Kubernetes Service 定义了外界访问一组特定 Pod 的方式,Service 有自己的IP和端口,Service为Pod提供了负载均衡。他也是 kubernetes 最核心的资源对象之一,每个Service其实就是我们经常提起的微服务架构中的一个"微服务"
1.2.5 Replication Controller
Replication Controller(简称RC)是Kubernetes系统中的核心概念之一,他其实定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值,所以 RC 的定义包括如下几个部分
1, Pod期待的副本数(replicas)
2, 用于筛选目标Pod的Label Selector
3, 当 Pod 的副本数量小于预期数量时,用于创建新的Pod模版(template)
以下是总结的 RC 的一些特性与作用
1, 在大多数情况下,我们通过定义一个 RC 实现 Pod 的创建过程及副本数量的自动控制
2, RC 里包含完整的 Pod 定义模版
3, RC 通过 Label Selector 机制实现对 Pod 副本的自动控制
4, 通过改变 RC 里的 Pod 副本数量,可以实现 Pod 的扩容或缩容功能
5, 通过改变 RC 里 Pod 模版中镜像版本,可以实现Pod的滚动升级功能
定义 RC 的 yaml 文件
apiVersion: v1
Kind: ReplicationController
metadata:
name: mytomcat
spec:
replicas: 2
selector:
app: mytomcat
template:
metadata:
labels:
app: mytomcat
spec:
containers:
- name: mytomcat
image: tomcat
ports:
- containerPort: 8080
2, Kubernetes 集群
Kubernetes 用于协调高度可用的计算机集群,这些计算机集群被连接作为单个单元工作。Kubernetes 在一个集群上以更有效的方式自动分发和调度容器应用程序.Kubernetes集群有两种类型的资源组成。
A, Master 是集群的调度节点
B, Nodes 是应用程序实际运行的工作节点
接下来为大家讲解一下如何快速部署一套 Kubernetes 集群,k8s集群部署有几种方式: kubeadm, minikube和二进制包. 前两者属于自动部署,简单部署操作,我们这里强烈推荐初学者使用二进制包部署,因为自动部署屏蔽了很多细节,使得对各个模块感知很少,非常不利于学习。
2.1 环境准备与规划
推荐配置 2 核2G Docker version 17.05.0-ce
| 角色 |
IP |
组件 |
| master |
192.168.126.140 |
etcd, kube-apiserver, kube-controller-manager, kube-scheduler,docker |
| node01 |
192.168.126.141 |
kube-proxy, kubelet, docker |
| node02 |
192.168.126.142 |
kube-proxy, kubelet, docker |
查看默认防火墙状态(关闭后显示 not running, 开启后显示 running) firewall-cmd-state
关闭防火墙 systemctl stop firewalled.service
禁止 firewalld 开机启动 systemctl disable firewalld.service
获取 Kubernetes 二进制包
https://github.com/kubernetes/kuberbetes/blob/master/CHANGELOG-1.9.md
https://github.com/kubernetes/kubernetes
https://github.com/helm/helm
https://github.com/kubernetes/minikube
https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG
https://github.com/kubernetes/kuberbetes/releases/tag/v3.6.12
https://github.com/etcd-io/etcd/releases/tag/v3.6.12
wget https://storage.googleapis.com/kubernetes-release/release/v1.22.2/kubernetes-server-linux-amd64.tar.gz
wget https://storage.googleapis.com/kubernetes-release/release/v1.19.15/kubernetes-server-linux-amd64.tar.gz
wget https://storage.googleapis.com/kubernetes-release/release/v1.19.3/kubernetes-server-linux-amd64.tar.gz
2.2 Master 安装
(1) 设置 yum 源
vim /etc/yum.repo.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
(2) 安装 docker
yum install docker-engine
(3) 安装后查看 docker 版本
docker -v
2.2.2 etcd 服务
etcd 做为 kubernetes 集群的主要服务, 在安装 kubernetes 各服务前需要首先安装和启动
1, 下载 etcd 二进制文件 etcd-v3.3.9-linux-amd64.tar.gz
https://github.com/etcd-io/etcd/releases
https://github.com/etcd-io/etcd/releases/download/v3.6.12/etcd-v3.6.12-linux-amd64.tar.gz
https://github.com/etcd-io/etcd/releases/download/v3.6.12/etcd-v3.6.12-windows-amd64.zip
2, 上传到 master
可以使用 lrzsz, 如果没有安装,可以通过 yum 进行安装 yum install lrzsz -y
3, 将 etcd 和 etcdctl 文件复制到 /usr/bin 目录
~:cp etcd etcdctl /usr/bin/
4, 配置 systemd 服务文件 /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=simple
EnvironmentFile=/etc/etcd/etcd.conf
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/bin/etcd
Restart=on-failure
[Install]
WantedBy=Multi-user.target
5, 启动与测试etcd服务
systemctl daemon-reload
systemctl enable etcd.service
mkdir -p /var/lib/etcd/
systemctl start etcd.service
etcdctl cluster-health
配置 systemd 服务文件 /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=simple
EnvironmentFile=/etc/etcd/etcd.conf
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/bin/etcd
Restart=on-failure
[Install]
WantedBy=Multi-user.target
启动与测试etcd服务
systemctl daemon-reload
systemctl enable etcd.service
mkdir -p /var/lib/etcd/
systemctl start etcd.service
etcdctl cluster-health
2.2.3 kube-apiserver 服务
解压后将 kube-apiserver, kube-controller-manager, kube-scheduler 以及管理要使用的 kubectl 二进制命令文件放在 /usr/bin 目录 ,完成者几个服务的安装
解压 kubernetes-server-linux-amd64.tar.gz
~: tar -zxvf kubernetes-server-linux-amd64.tar.gz
~: cd kubernetes
~: ls
addons kubernetes-src.tar.gz LICENSES server
~: cd server
~: ls
bin
~: cd bin
~: ls
apiextensions-apiserver cloud-controller-manager cloud-controller-manager.tar kubeadm
cloud-controller-manager.docker_tag hvperkube kube-aggregator kube-aggregator.docker_tag kube-addregator.tar
kube-apiserver kube-apiserver.docker_tag kube-apiserver.tar
kube-controller-manager kube-controller-manager.docker_tag kube-controller-manager.tar
kubectl kubelet mounter
kube-proxy kube-proxy.docker_tag kube-proxy.tar
kube-scheduler kube-scheduler.docker_tag kube-scheduler.tar
~: cp kube-apiserver kube-controller-manager kube-scheduler /usr/bin/
cp kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/bin/
下面是对 kube-apiserver 服务进行配置
编辑 systemd 服务文件 vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=etcd.service
Wants=etcd.service
[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
Type=notity
[Install]
WantedBy=multi-user.target
配置文件
创建目录 mkdir /etc/kubernetes
vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=0.0.0.0 --insecure-port=9090 --service-cluster-ip-range=169.169.0.0/16 --service-node-port-range=1-65535 --admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,DefaultStorageClass,ResourceQuota --logtostderr=true log-dir=/var/log/kubernetes --v=2"
解压 kubernetes 服务
解压 kubernetes-server-linux-amd64.tar.gz
~: tar -zxvf kubernetes-server-linux-amd64.tar.gz
~: cd kubernetes
~: ls
addons kubernetes-src.tar.gz LICENSES server
~: cd server
~: ls
bin
~: cd bin
~: ls
apiextensions-apiserver cloud-controller-manager cloud-controller-manager.tar kubeadm
cloud-controller-manager.docker_tag hvperkube kube-aggregator kube-aggregator.docker_tag kube-addregator.tar
kube-apiserver kube-apiserver.docker_tag kube-apiserver.tar
kube-controller-manager kube-controller-manager.docker_tag kube-controller-manager.tar
kubectl kubelet mounter
kube-proxy kube-proxy.docker_tag kube-proxy.tar
kube-scheduler kube-scheduler.docker_tag kube-scheduler.tar
~: cp kube-apiserver kube-controller-manager kube-scheduler /usr/bin/
2.2.4 kube-controller-manager 服务
kube-controller-manager 服务依赖于 kube-apiserver 服务:
配置 systemd 服务文件: vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNoFILE=65536
[Install]
WantedBy=multi-user.target
配置文件 vim /etc/kubernetes/controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--master=http://192.168.126.140:8080 --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
2.2.5 kube-scheduler 服务
kube-scheduler 服务也依赖于 kube-apiserver 服务。
配置 systemd 服务文件: vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件 vim /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="--master=http://192.168.126.140:8080 --logtostderr-true --log-dir=/var/log/kubernetes --v=2"
2.2.6 启动
完成以上配置后,按顺序启动服务
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
systemctl status etcd
systemctl enable docker
systemctl start docker
systemctl status docker
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service
检查每个服务的健康状态
systemctl status kube-apiserver.service
systemctl status kube-controller-manager.service
systemctl status kube-scheduler.service
2.3 Node1 安装
在 Node 节点上, 以同样的方式把从压缩包者解压出的二进制文件 kubelet kube-proxy放到 /usr/bin目录中
在 Node 节点上需要预先安装 docker 请参考 Master 上 Docker 的安装, 并启动 Docker
2.3.1 kubelet 服务
配置 systemd 服务文件 vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes kubelet-Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
workingDirectory=/var/lib/kubelet
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=on-failure
KillNode=process
[Install]
WantedBy=multi-user.target
mkdir -p /var/lib/kubelet
mkdir -p /etc/kubernetes
配置文件: vim /etc/kubernetes/kubelet
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=192.168.126.142 --logtostderr=false --lod-dir=/var/log/kubernetes --v=2 --fail-swap-on=false"

用于 kubelet 连接 Master Apiserver 的配置文件
vim /etc/kubernetes/kubeconfig 描述的是连接服务器(Master)的信息
apiVersion: v1
Kind: Config
clusters:
- cluster:
server: http://192.168.126.147:8080
name: local
contexts:
- context:
cluster: local
name: mycontext
current-context: mycontext
上传文件
找到要上传的文件 kubernetes-server-linux-amd64.tar.gz 到 Node 节点
上传文件 kubernetes-server-linux-amd64.tar.gz
上传文件结束
解压 tar -zxvf kubernetes-server-linux-amd64.tar.gz
查看解压文件 ll
cd /kubernetes/server/bin/
再次查看 ll 找到 kubelet kube-proxy
将 kubelet kube-proxy 这两个文件复制到 /usr/bin/ 即 cp kubelet kube-proxy /usr/bin/
安装 docker
1, 配置镜像 设置 yum 源
vim /etc/yum.repo.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
2,安装 docker
yum install docker-engine
至此 Node节点的准备工作就结束了
2.3.2 kube-proxy 服务
kube-proxy 服务依赖于 network 服务, 所以一定要保证 network 服务正常, 如果 network 服务启动失败,常见解决方案有以下几种:
1, 和 NetworkManager 服务源冲突, 这个好解决, 直接关闭 NetworkManager 服务就好了, service NetworkManager stop,并且禁止开机启动 chkconfig NetworkManager off,之后重启就好了
2, 和配置文件的 MAC地址不匹配,这个也好解决,使用 ip addr (或ifconfig) 查看 MAC地址,将 /etc/sysconfig/network-scripts/ifcfg-xxx中的 IPADDR改为查看到的 mac 地址
3, 设定开机启动一个名为 NetworkManager-wait-online服务,命令为
systemctl enable NetworkManager-wait-online.service
4, 查看 /etc/sysconfig/network-scripts 下,将其余无关的网卡位置文件全删掉,避免不必要的影响,即只留一个以 ifcfg开头的文件
配置 systemd 服务文件: vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.service
Requires=network.service
[Service]
EnviormentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
KillNode=process
[Install]
WantedBy=multi-user.target
配置文件 vi /etc/kubernetes/proxy
KUBE_PROXY_ARGS="--master=http://192.168.126.140:8080 --hostname-override=192.168.126.142 --logtostderr=true --log-dir=/vat/log/kubernetes --v=2"
2.3.3 启动
systemctl daemon-reload
systemctl enable docker
systemctl start docker
systemctl status docker
systemctl enable kubelet
systemctl start kubelet
systemctl status kubelet
systemctl enable kube-proxy
systemctl start kube-proxy
systemctl status kube-proxy
启动 Node1 节点 docker
启动 Node1 节点 kubelet
启动 Node1 节点 kube-proxy
2.4 Node2 安装
可以(复制)克隆一份 j将配置文件修改以下就可以了 参考 Node1 安装,注意修改 IP
克隆 Node1 节点后重新编辑 vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改 IPADDR(ip地址) 的值和修改HWADDR(mac地址)的值
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLLED=yes
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=ens33
IPADDR=192.168.126.149
NETMASK=255.255.255.0
DNS1=8.8.8.8
DNS2=114.114.114.114
PREFIX=24
GATEWAY=192.168.126.2
HWADDR=00:0c:29:F2:b6:e7
生成 'HWADDR' 新的mac地址步骤如下
找到 '克隆' 虚拟机 右键点击 '设置'
找到 '网络适配器' 点击 '高级'
点击 "生成",重新生成一个mac地址
点击 '生成' 就重新生成一个新的 mac 地址
第一步: 修改配置文件 vim /etc/kubernetes/kubelet 修改主机ip 就可以了 其他不动
mkdir -p /var/lib/kubelet
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=192.168.126.142 --logtostderr=false --log-dir=/var/log/kubernetes --v=2 --fail-swap-on=false "
修改为 修改主机ip 就可以了 其他不动
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=192.168.126.149 --logtostderr=false --log-dir=/var/log/kubernetes --v=2 --fail-swap-on=false "
这是别的地方配置文件
KUBELET_ARGS="--pod-infra-container-image=192.168.126.142:5000/pod-infrastructure:latest --kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=192.168.126.142 --logtostderr=false --log-dir=/var/log/kubenetes --v=2 --fail-swap-on=false "
第二步 修改 用于kubelet连接Master Apiserver 的配置文件
vim /etc/kubernetes/kubeconfig
apiVersion: v1
Kind: Config
clusters:
- cluster:
server: http://192.168.126.140:8080
name: local
contexts:
- context:
cluster: local
name: mycontext
current-context: mycontext
修改为 Master 主机的 ip
apiVersion: v1
Kind: Config
clusters:
- cluster:
server: http://192.168.126.147:8080
name: local
contexts:
- context:
cluster: local
name: mycontext
current-context: mycontext
第三步 修改 kube-proxy
修改配置文件 vim /etc/kubernetes/proxy
KUBE_PROXY_ARGS="--master=http://192.168.126.140:8080 --hostname-override=192.168.126.142 --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
修改为
KUBE_PROXY_ARGS="--master=http://192.168.126.147:8080 --hostname-override=192.168.126.149 --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
至此 Node2节点就安装完成
查看 找不到
查看 然后将 kubectl 拷贝到 /usr/bin/ 目录下 cp kubectl /usr/bin/
回到根目录下再执行 kubectl get nodes 就可以看到 Node 节点虚拟机了
查看集群状态 kubectl get cs 查看master集群组件状态
去 master 节点创建 vim /usr/local/k8s/nginx-rc.yaml 文件
vim /usr/local/k8s/nginx-rc.yaml
apiVersion: v1
Kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 2
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
kubectl create -f nginx-rc.yaml
kubectl apply -f nginx-rc.yaml
去 master 节点创建 vim /usr/local/k8s/nginx-svc.yaml 文件
vim /usr/local/k8s/nginx-svc.yaml
apiVersion: v1
Kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
nodePort: 33333
selector:
app: nginx
kubectl create -f nginx-svc.yaml
kubectl apply -f nginx-svc.yaml
创建
查看
解决方案2
1, docker pull kubernetes/pause
2, docker tag docker.io/kubernetes/pause:latest 192.168.126.143:5000/google_containers/pause-amd64.3.0
3, docker push 192.168.126.143:5000/google_containers/pause-amd64.3.0
4, vim /etc/kubernetes/kubelet
配置为 添加 拉取自己私有创建的镜像
KUBELET_ARGS="--pod_infra_container_image=192.168.126.143:5000/google_containers/pause-amd64.3.0"
5, 重启 kubelet 服务
systemctl restart kubelet
老师的执行
修改配置文件 添加 拉取自己私有创建的镜像 vim /etc/kubernetes/kubelet
重新启动 kubelet 服务
在 master 节点执行 kubectl get pods
在 master 节点执行 kubectl describe pods nginx-wxbjr 查看具体容器的详细信息
三个节点的详细信息 有两个 pod ,每个pod上有三个nginx
查看镜像 docker images
查看 cat /usr/local/k8s/nginx-rc.yaml 文件
搭建私有仓库
搭建私有仓库
docker pull registry
docker run -di --name=registry -p 5000:5000 registry
修改 daemon.json("insecure-registries":{"192.168.126.148:5000"})
重启docker服务 systemctl restart docker
上传
docker tag jdk1.8 192.168.126.148/jdk1.8
docker start registry
docker push 192.168.126.148:5000/jdk1.8
修改 vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["192.168.126.148:5000"]
}
总结:
1, k8s架构组件
2 k8s集群搭建常见问题
解决 kubectl get pods时No resources found问题
1, vim /etc/kubernetes/apiserver
2, 找到 KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota",去掉 ServiceAccount ,保存退出
3,systemctl restart kube-apiserver 重启此服务
pull 失败
解决方案1
1,yum install rhsm -y
2, docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
如果以上两步解决问题了,那么不需要在执行下面操作
3, docker search pod-infrastructure
4, docker pull docker.io/tianyebj/pod-infrastructure
5, docker tag tianyebj/pod-infrastructure 192.168.126.143:5000/pod-infrastructure
6, docker push 192.168.126.143:5000/pod-infrastructure
7, vim /etc/kubernetes/kubelet
修改 KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.126.143:5000/pod-infrastructure:latest"
8, 重启服务
systemctl restrat kube-apiserver
systemctl restart kube-controller-manager
systemctl restart kube-scheduler
systemctl restart kubelet
systemctl restart kube-proxy
解决方案2
1, docker pull kubernetes/pause
2, docker tag docker.io/kubernetes/pause:latest 192.168.126.143:5000/google_containers/pause-amd64.3.0
3, docker push 192.168.126.143:5000/google_containers/pause-amd64.3.0
4, vim /etc/kubernetes/kubelet
配置为
KUBELET_ARGS="--pod_infra_container_image=192.168.126.143:5000/google_containers/pause-amd64.3.0"
5, 重启 kubelet 服务 systemctl restart kubelet
====
私有仓库搭建
docker pull registry
docker run -di --name=registry -p 5000:5000 registry
修改 daemon.json {"insecure-registries": ["192.168.126.143:5000"]}
重启 docker 服务 systemctl restart docker
3, 常用命令
获取当前命名空间下的容器
kubectl get pods
获取所有容器列表
kubectl get all
创建 容器
kubectl create -f kubernate-pvc.yaml
删除容器
kubectl delete pods/test-pd 或者 kubectl delete -f rc-nginx.yaml
查看指定pod跑在哪个 node 上
kubectl get pod/test-pd -o wide
查看容器日志
kubectl logs nginx-8586cf59-mwwtc
进入容器终端命令
kubectl exec -it nginx-8586cf59-mwwtc /bin/bash
一个 Pod 里含有多个容器 用 --container or -C 参数。
例如: 假如这里有个 Pod 名为 my-pod ,这个 Pod 有两个容器,分别名为main-app和helper-app下面的命令将打开到 main-app 的shelld容器里。
kubectl exec -it my-pod --container main-app --/bin/bash
容器详情列表
kubectl describe pod/mysql-m8rbl
查看容器状态
kubectl get svc
一个 Pod 里含有多个容器 用 --container or -C 参数。
例如: 假如这里有个 Pod 名为 my-pod ,这个 Pod 有两个容器,分别名为main-app和helper-app下面的命令将打开到 main-app 的shelld容器里。
kubectl exec -it my-pod --container main-app --/bin/bash
容器详情列表
kubectl describe pod/mysql-m8rbl
查看容器状态
kubectl get svc
常用命令实践
获取 pod 和 service 命令 kubectl get all
查看服务 / 删除服务 kubectl get pods / kubectl delete -f nginx-rc.yaml
pod服务全部删除 kubectl delete -f nginx-svc.yaml / 查看服务 kubectl get svc
重新创建服务 kubectl create -f nginx-rc.yaml / kubectl create -f nginx-svc.yaml
查看容器详细信息 kubectl describe pods nginx-glqr8