kubeadm工作原理

安装master

在初始化master时,只需要执行kubeadm init命令即可:

kubeadm init --pod-network-cidr 10.244.0.0/16 --kubernetes-version st able

这个命令会自动:

  • 系统状态检查;
  • 生成token;
  • 生成自签名CA和client端证书;
  • 生成kubeconfig用于kubelet连接API server;
  • 为master组件生成static Pod manifest并放到/etc/Kubernetes/manifests目录中;
  • 配置RBAC并设置Master node只运行控制平面组件;
  • 创建附加服务,比如kube-proxy和kube-dns;

添加Node

token=$(kubeadm token list | grep authentication,signing | awk '{prin t $1}') 
kubeadm join --token $token ${master_ip}

这包括一下几个步骤:

  • 从API server下载CA;
  • 创建本地证书,并请求API server签名;
  • 最后配置kubelet连接到API server;

删除安装

kubeadm reset

kubectl

kubectl提供了大量的子命令,方便Kubernetes集群中的各种功能,下面介绍如何查询命令的帮助:

  • kubelet -h 查看子命令列表;
  • kubelet options 查看全局选项;
  • kubelet <command> --help 查看子命令帮助;
  • kubelet [command] [PARAMS] -o = <format> 设置输出格式;
  • kubelet explain [RESOURCE] 查看资源定义;

配置

使用kubelet的第一步是配置Kubernetes集群以及认证方式,包括:

  • cluster信息:Kubernetes server地址;
  • 用户信息: 用户名、密码、密钥;
  • Context:cluster、用户信息以及Namespace的组合;

常用命令格式

  • 创建: kubectl run <name> --image=<image> 或者 kubectl create -f manifest.yaml
  • 查询:kubectl get <resource>
  • 更新:kubectl set 或者 kubectl patch
  • 删除: kubectl delete <resource> <name> 或者 kubectl delete -f manifest.yaml
  • 查询Pod IP: kubectl get pod <pod-name> -o jsonpath='{.status.podIP}'
  • 容器内执行命令:kubectl exec -ti <pod-name> sh
  • 容器日志:kubectl logs [-f] <pod-name>
  • 导出服务:kubectl expose deploy <name> --port=80
  • Base64解码:kubectl get secret SECRET -o go-template='{{ .data.KEY | base64decode }}'

kubectl run仅支持Pod、Replication Controller、Deployment、Job和Crontab等几种资源,默认为Deployment:

创建的资源类型

参数

Pod

--restart=Never

Replication Controller

--generator=run/.v1

Deployment

--restart=Always

Job

--restart=OnFailure

CronJob

--shedule=<cron>

连接到一个正在运行的容器

kubectl attach 用于连接到一个正在运行的容器,跟docker的attach命令类似。

在容器内部执行命令

kubectl exec用于在一个正在运行的容器执行命令;

端口转发

kubectl port-forward用于将本地端口转发到指定的Pod。

# 本地监听5000和6000端口,在pod中转发5000和6000端口的数据
kubectl port-firward mypod 5000 6000

# Listen on port 8888 locally, forwarding to 5000 in the pod 
kubectl port-forward mypod 8888:5000

# Listen on a random port locally, forwarding to 5000 in the pod 
kubectl port-forward mypod :5000 

# Listen on a random port locally, forwarding to 5000 in the pod 
kubectl port-forward mypod 0:5000

也可以将本地端口转发到服务、复制控制器或者部署的端口。

# Forward to deployment 
kubectl port-forward deployment/redis-master 6379:6379
# Forward to replicaSet
kubectl port-forward rs/redis-master 6379:6379
# Forward to service
kubectl port-forward svc/redis-master 6379:6379

API server代理

kubectl proxy 命令提供了一个Kubernetes API服务的HTTP代理。

kubectl proxy --port=8080

可以通过代理地址http://localhost:8080/api/来直接访问Kubernetes API,比如查询Pod列表

curl http://localhost:8080/api/v1/namespaces/default/pods

如果通过--address指定了非localhost的地址,则访问8080端口时会报未授权的错误,可以设置--accept-hosts来避免这个问题。

kubectl proxy --address='0.0.0.0' --port=8080 --accept-hosts='^*$'

文件拷贝

kubectl cp 支持从容器中拷贝,或者拷贝文件到容器中。

# Copy /tmp/foo_dir local directory to /tmp/bar_dir in a remote pod in the default namespace 
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir 
# Copy /tmp/foo local file to /tmp/bar in a remote pod in a specifi c container 
kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container> 
# Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace> 
kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar 
# Copy /tmp/foo from a remote pod to /tmp/bar locally 
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar

Options: -c, --container='': Container name. If omitted, the first container in the pod will be chosen

kubectl drain

kubectl drain NODE [Options]
  • 它会删除该NODE 上由ReplicationController、ReplicaSet、DaemonSet、StatefulSet on Job创建的Pod;
  • 不删除mirror pods因为不可通过API删除mirror pods;
  • 如果还有其他类型的Pod并且没有–force选项,该命令会直接失败;
  • 如果命令中增加了–force选项,则会强制删除这些不是通过ReplicationController Job或者DaemonSet创建的Pod。

有的时候不需要evict pod,只需要标记Node不可调用,可以用kubectl cordon命令,恢复的话只需要运行kubectl uncordon NODE将NODE重新改成可调度状态。

权限检查

kubectl auth 提供了两个子命令用于检查用户的鉴权情况:

  • kubectl auth can-i 检查用户是否有权限进行某个操作。
# Check to see if I can create pods in any namespace 
kubectl auth can-i create pods --all-namespaces 
# Check to see if I can list deployments in my current namespace 
kubectl auth can-i list deployments.extensions 
# Check to see if I can do everything in my current namespace ("*" means all) 
kubectl auth can-i '*' '*' 
# Check to see if I can get the job named "bar" in namespace "foo" 
kubectl auth can-i list jobs.batch/bar -n foo

查看事件

# 查看所有事件 
kubectl get events --all-namespaces 
# 查看名为nginx对象的事件 
kubectl get events --field-selector involvedObject.name=nginx,involve dObject.namespace=default 
# 查看名为nginx的服务事件 
kubectl get events --field-selector involvedObject.name=nginx,involvedObject.namespace=default,involvedObject.kind=Service 
# 查看Pod的事件 
kubectl get events --field-selector involvedObject.name=nginx-85cb586 7f-bs7pn,involvedObject.kind=Pod