记录几个常用的
Master:Master 组件提供集群的控制平台。Master 组件对集群进行全局决策(例如,调度),并检测和响应集群事件(例如,当不满足部署的 replicas 字段时,启动新的 pod)。Master 组件可以在集群中的任何节点上运行。
--cloud-provider
参数设置为 external
来禁用云控制器循环监控。主要控制器包括:
Node:节点组件在集群每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境
kubelet一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。
kube-proxy:kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。如果有 kube-proxy 可用,它将使用操作系统数据包过滤层。否则,kube-proxy 会转发流量本身。
容器运行时(Container Runtime):容器运行时是负责运行容器的软件。Kubernetes 支持多个容器运行时: Docker、containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。
Addon:插件,扩展了 Kubernetes 的功能;插件分类:
kubectl logs
命令获取基本日志记录内容
Kubernetes设计理念和功能其实就是一个类似Linux的分层架构:
核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层:kubectl命令行工具、客户端SDK以及集群联邦
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
kubeadm
kubeadm [command]
kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈
kubeadm config 如果你使用 kubeadm v1.7.x 或者更低版本,你需要对你的集群做一些配置以便使用 kubeadm upgrade 命令
kubeadm help 帮助信息
kubeadm init 启动一个 Kubernetes 主节点
kubeadm join 启动一个 Kubernetes 工作节点并且将其加入到集群
kubeadm reset 还原之前使用 kubeadm init 或者 kubeadm join 对节点产生的改变
kubeadm token 使用 kubeadm join 来管理令牌
kubeadm upgrade 更新一个 Kubernetes 集群到新版本
kubeadm version 打印出 kubeadm 版本
主机 | 系统 | IP | 作用 |
---|---|---|---|
node1 | rhel7.5 | 192.168.27.11 | 安装有Docker(18.09.6)、可访问私有仓库、作为部署的master节点 |
node2 | rhel7.5 | 192.168.27.12 | 安装有Docker(18.09.6)、可访问私有仓库、node节点 |
node3 | rhel7.5 | 192.168.27.13 | 安装有Docker(18.09.6)、可访问私有仓库、node节点 |
repository | rhel7.5 | 192.168.27.12 | 搭建有harbor私有仓库,作为集群操作中的镜像使用仓库 |
安装docker环境,是为了k8s在作为容器运行时使用
[root@node1 docker]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://reg.mydocker.com"],
"exec-opts": ["native.cgroupdriver=systemd"], #此处为重点,必须填写内容,其他可以根据需要增加
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
[root@node1 docker]# systemctl daemon-reload
[root@node1 docker]# systemctl restart docker.service
[root@node1 ~]# swapoff -a
[root@node1 ~]# vim /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
[root@node1 ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
[root@node1 ~]# sysctl --system
[root@node1 ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
[root@node1 ~]# yum install kubelet kubeadm kubectl -y
[root@node1 ~]# systemctl enable --now kubelet.service
[root@node1 ~]# kubeadm config print init-defaults
……
imageRepository: k8s.gcr.io
……
#查看kubeadm配置文件信息,可以看到其中这条,镜像资源位k8s.gcr.io,无法使用
[root@node1 ~]# kubeadm config images list
W0223 00:07:22.549605 1592 validation.go:28] Cannot validate kube-proxy cotor is available
W0223 00:07:22.549654 1592 validation.go:28] Cannot validate kubelet confi is available
k8s.gcr.io/kube-apiserver:v1.17.3
k8s.gcr.io/kube-controller-manager:v1.17.3
k8s.gcr.io/kube-scheduler:v1.17.3
k8s.gcr.io/kube-proxy:v1.17.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
[kubeadm@node1 add-ons]$ kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
W0223 01:57:06.960018 7598 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0223 01:57:06.960511 7598 validation.go:28] Cannot validate kubelet config - no validator is available
registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.3
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.3
registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.3
registry.aliyuncs.com/google_containers/kube-proxy:v1.17.3
registry.aliyuncs.com/google_containers/pause:3.1
registry.aliyuncs.com/google_containers/etcd:3.4.3-0
registry.aliyuncs.com/google_containers/coredns:1.6.5
#查看阿里云的镜像资源信息是否与k8s的配置资源一致
[root@node1 ~]# kubeadm config images pull --image-repository registry.aliyunntainers
#将使用到的镜像拉取下来
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID
registry.aliyuncs.com/google_containers/kube-proxy v1.17.3 ae853e93
registry.aliyuncs.com/google_containers/kube-apiserver v1.17.3 90d27391
registry.aliyuncs.com/google_containers/kube-controller-manager v1.17.3 b0f1517c
registry.aliyuncs.com/google_containers/kube-scheduler v1.17.3 d109c082
registry.aliyuncs.com/google_containers/coredns 1.6.5 70f31187
registry.aliyuncs.com/google_containers/etcd 3.4.3-0 303ce5db
registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba
# 查看拉取的镜像文件
[root@node1 ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers
#进行初始化控制节点
#--pod-network-cidr=10.244.0.0/16 是根据要添加flannel插件设置的
……
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
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.27.11:6443 --token kb3of5.77ez8xh3pv1q2g26 \
--discovery-token-ca-cert-hash sha256:49ae0dde8ff27dddaca8ad1885aecdb24e8c2144d52cf778825345f168f12211
#出现以上信息表示Master控制节点初始化完成了
kubeadm join 192.168.27.11:6443 --token kb3of5.77ez8xh3pv1q2g26 \
--discovery-token-ca-cert-hash sha256:49ae0dde8ff27dddaca8ad1885aecdb24e8c2144d52cf778825345f168f12211
#上面2行提示,在其他节点运行就可以加入集群了,与dockerswarm类似
[root@node1 ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
kb3of5.77ez8xh3pv1q2g26 23h 2020-02-24T00:58:12+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
#可以看出k8s的token是有时效性的,24小时
注意:
1. token过期后,使用kubeadm token create
创建新的token
2. 如果Master节点初始化失败了,运行kubeadm reset
,清楚之前留存的信息,避免再次创建发生冲突
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
[root@node1 ~]# useradd kubeadm
#用户名称自由设置
[root@node1 ~]# visudo
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
93 kubeadm ALL=(ALL) NOPASSWD: ALL
# 添加93行信息,将kubeadm设置权限,同时登录不使用密码,根据需求进行设置
[root@node1 ~]# su - kubeadm
#登录用户kubeadm
[root@node1 ~]# su - kubeadm
[kubeadm@node1 ~]$ mkdir -p $HOME/.kube
[kubeadm@node1 ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[kubeadm@node1 ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
#运行k8s提示代码
[root@node2 ~]# kubeadm join 192.168.27.11:6443 --token kb3of5.77ez8xh3pv1q2g26 --dis778825345f168f12211
W0223 01:20:43.573088 15204 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane s
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.17" Confi
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
[root@node3 ~]# kubeadm join 192.168.27.11:6443 --token kb3of5.77ez8xh3pv1q2g26 --dis778825345f168f12211
W0223 01:20:43.573088 15204 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane s
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.17" Confi
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
#节点node2和node3加入集群
#根据提示查看节点信息
[kubeadm@node1 ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
node1 NotReady master 30m v1.17.3
node2 NotReady 7m38s v1.17.3
node3 NotReady 7m14s v1.17.3
在使用kubectl的时候,无法自动不全命令,需要添加一行代码在bashrc中,直接运行本行命令echo "source <(kubectl completion bash)">> ~/.bashrc
,重启加载bashrcsource .bashrc
,即可完成kubectl命令不全
[kubeadm@node1 ~]$ kubectl get ns
NAME STATUS AGE
default Active 34m
kube-node-lease Active 34m
kube-public Active 34m
kube-system Active 34m
#查看ns都也哪些,其中系统管理的都在kube-system
[kubeadm@node1 ~]$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-9d85f5447-fktb7 0/1 Pending 0 34m
coredns-9d85f5447-wvx48 0/1 Pending 0 34m
etcd-node1 1/1 Running 0 34m
kube-apiserver-node1 1/1 Running 0 34m
kube-controller-manager-node1 1/1 Running 0 34m
kube-proxy-98v44 1/1 Running 0 12m
kube-proxy-jd6gd 1/1 Running 0 11m
kube-proxy-wggcv 1/1 Running 0 34m
kube-scheduler-node1 1/1 Running 0 34m
#查看具体信息,可以看出网络配置不完全
[kubeadm@node1 add-ons]$ \vi kube-flannel.yml
……
网址中400多行代码粘贴到文件中
……
#建立flannel的yml文件
[kubeadm@node1 add-ons]$ kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created
#添加flannel插件
[kubeadm@node1 add-ons]$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-9d85f5447-fktb7 1/1 Running 0 42m
coredns-9d85f5447-wvx48 1/1 Running 0 42m
etcd-node1 1/1 Running 0 42m
kube-apiserver-node1 1/1 Running 0 42m
kube-controller-manager-node1 1/1 Running 0 42m
kube-flannel-ds-amd64-b9bhf 1/1 Running 0 64s
kube-flannel-ds-amd64-jszkh 1/1 Running 0 64s
kube-flannel-ds-amd64-l7drb 1/1 Running 0 64s
kube-proxy-98v44 1/1 Running 0 19m
kube-proxy-jd6gd 1/1 Running 0 19m
kube-proxy-wggcv 1/1 Running 0 42m
kube-scheduler-node1 1/1 Running 0 42m
#再次查看已经完全运行
[kubeadm@node1 add-ons]$ kubectl get node
NAME STATUS ROLES AGE VERSION
node1 Ready master 43m v1.17.3
node2 Ready 20m v1.17.3
node3 Ready 20m v1.17.3
#查看节点信息也是运行中
[kubeadm@node1 add-ons]$ kubectl taint nodes --all node-role.kubernetes.io/master-
node/node1 untainted
taint "node-role.kubernetes.io/master" not found
taint "node-role.kubernetes.io/master" not found