kubernetes
kubernetes 知识点
1. 核心组件
etcd 保存整个集群的状态信息,感觉相当于 k8s 的数据库
apiserver 提供对 k8s 资源操作的唯一入口,并提供认证授权,访问控制,API 注册与发现等机制
controller manager 负责维护集群的状态,eg: 故障检测,自动扩展 pod,滚动更新等
scheduler 负责对资源的调度,按着预定的调度策略将 pod 调度到相应的集群上
kubelet 负责维护容器的生命周期,相当于在 node 上的 agent,负责管理 pods 和它们上面的容器,images 镜像、volumes 等
kube-proxy 负责为 service 提供集群内部的服务发现和负载均衡
2. kubernetes 常用命令
查看集群信息
kubectl cluster-info
在集群中运行一个应用程序
kubectl run nginx-test –replicas=3 –labels=’app=nginx’ –image=nginx:latest –port=80
#使用 kubectl run 命令启动一个 pod,自定义名称为 nginx-test,启动了 3 个 pod 副本,并给 pod 打上标签 app=nginx,这个 pod 拉取 docker 镜像 nginx:latest,开放端口 80
查看集群中所有 pod
kubectl get po
kubectl get pod
kubectl get pods
根据标签 label 查看集群中 pod
kubectl get pods -l app
kubectl get pods -l app=nginx
查看标签为 app=nginx 的 pod 在集群中具体分配在哪个节点和 pod 的 ip
kubectl get pods -l app=nginx -o wide
查看 pod 的详细信息
kubectl describe pods <podname>
查看集群中的 deployment(其他命令与 pod 类似)
kubectl get deploy
查看集群中的 replica set(其他命令与 pod 类似)
kubectl get replicaset
kubectl get rs
创建一个 service,集群中的资源通过 service 与外界交互
kubectl expose deploy nginx-test –port=8080 –target-port=80 –name=nginx-service
#k8s 集群通过 deploy 来管理,导出名为 nginx-test 的 deploy,为其创建名为 nginx-service 的服务开放给外界,使外界能通过 nginx-service 来和 nginx-test 交互,外部端口为 8080, 内部端口为 80
查看集群中的服务(其他命令与 pod 类似)
kubectl get svc
查看 pod 中容器的日志
kubectl log <podname> #查看指定 pod 内容器的日志
kubectl log -l app=nginx #查看标签 lable 为 app=nginx 下的 pod 的容器日志
pod 的副本的扩容和缩容
kubectl scale deploy nginx-test –replicas10
#通过 kubectl scale 将名为 nginx-test 的 deploy 重新定义有 10 个副本 pod
查看 pod 副本扩容缩容的实时进度
kubectl rollout status deploy nginx-test
删除资源
pod 和 rs 不能直接被删除, 其被 deploy 控制, 即使删除了某一 pod, 也会创建新的 pod 来对应配置 pod 副本数量, 要想删除 pod, 只能用删除其 deploy 来删除, 或者变更 pod 副本配置缩容(如上)
kubectl delete deploy nginx-test #删除部署的 deploy(删除其对于的 pod 和 rs)
kubectl delete svc nginx-service #删除创建的 service
3. 应用创建部署 yaml 文件
tomsun28 之后的 k8s 应用部署修改,都确定使用 apply 形式部署更新,使用 git 版本控制创建资源,好处多多
kubectl apply -f nginx.yaml ## 更新式创建资源,如果不存在此资源则创建,如存在改动则调整资源(推荐)
kubectl delete -f nginx.yaml #资源 (pod,deployment,service,replicaset…) 删除销毁
kubernetes 部署 nginx 集群
nginx.yaml :
# ———————-nginx——————— #
# ——nginx deployment—— #
kind: Deployment
apiVersion: apps/v1beta2
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
– name: nginx
image: 192.167.2.144:5000/nginx:latest
ports:
– containerPort: 80
—
# ——-nginx-service——— #
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
– port: 80
targetPort: 80
nodePort: 30001
selector:
app: nginx
kubectl apply -f nginx.yaml
记一下对 kubernetes 集群的搭建部署
ubantu 下用 kubeadm 搭建 kubernetes 集群
官方安装教程
ubuntu + docker 环境 (目前是两个服务器组建集群 server1+server2)
安装 kubelet kubeadm 和 kubectl
安装 apt-transport-https
# apt-get update && apt-get install -y apt-transport-https
安装 gpg 证书(阿里镜像仓库的 k8s)
# curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add –
更新软件源信息
# cat << EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
更新并安装 kubelet kubeadm kubectl
# apt-get update && apt-get install -y kubelet kubeadm kubectl 指定版本为: # apt-get update && apt-get install -y kubelet=1.11.1-00 kubeadm=1.11.1-00 kubectl=1.11.1-00
关闭 swap
sudo swapoff -a
master server1 上初始化部署 kubernetes 的 master
获取初始化所需版本 docker 镜像,k8s=v1.11.1 在我的 docker hub ‘s tomsun28 可以拉取
# kubeadm config images list ## 查询当前 kubeadm 版本所需 images
# kubeadm config images pull ## 拉取这些 images
k8s=v1.11.1 所对应镜像及版本:
k8s.gcr.io/coredns:1.1.3
k8s.gcr.io/etcd-amd64:3.2.18
k8s.gcr.io/kube-apiserver-amd64:v1.11.1
k8s.gcr.io/kube-controller-manager-amd64:v1.11.1
k8s.gcr.io/kube-proxy-amd64:v1.11.1
k8s.gcr.io/kube-scheduler-amd64:v1.11.1
k8s.gcr.io/pause:3.1
初始化 master
kubeadm init –kubernetes-version=v1.11.1 –apiserver-advertise-address=116.196.81.106 –pod-network-cidr=10.244.0.0/16
–apiserver-advertise-address=<ip>
指定 apiserver 的访问 ip,ip 默认为当前虚拟机的默认网卡 ip.
当 ip 为内网地址时,k8s 集群只能搭建在网段内部, 如果有需求通过外网 ip 来操作 apiserver, 需要在启动集群时添加可信参数 –apiserver-cert-extra-sans=116.196.81.106 将外网的 ip 添加进去.
当 ip 为外网地址时, 可以实现不同网段的虚拟机组成 k8s 集群(目前我就是这个需要, 一个京东云一个阿里云), 暂时还没测这种跨公网的集群性能咋样, 毕竟考虑到网速带宽等不如内网, 但有一个优势就是可以整合不同的资源, 不被同一云商所束缚,jd 挂了 ali 还可以用.
成功之后会有 join 集群的脚步提示,记一下
kubeadm join 192.168.0.3:6443 –token q6gmgt.3dakenwttapw4n2o –discovery-token-ca-cert-hash sha256:dbf69119e962456c239c5f7821ee9a0db46fb643fc40da8776d4e032de072085
根据 output 提示,to start using your cluster, you need to run(no root 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 user):export KUBECONFIG=/etc/kubernetes/admin.conf
安装 pod network 提供 pods 节点之前相互通信
运行下面命令设置 /proc/sys/net/bridge/bridge-nf-call-iptables 为 1
sysctl net.bridge.bridge-nf-call-iptables=1
选择 flannel 作为 pod network
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/c5d10c8/Documentation/kube-flannel.yml
要使 flannel 能正常使用, 需要在 master 初始化时 kubeadm init 添加对应 pod-network-cidr
kubeadm init –pod-network-cidr=10.244.0.0/16
解除 master 不能调度运行其他 pod 的限制
kubectl taint nodes –all node-role.kubernetes.io/master-
server2 上部署 kebernetes 并作为节点 join to master
在 server2 服务器上执行步骤 2
作为 node 节点加入到 master 集群中
kubeadm join –token <token> <master-ip>:<master-port> –discovery-token-ca-cert-hash sha256:<hash>
在 master 上查看集群 node 节点分布
kubectl get nodes
对 kubeadm 所做的搭建进行 undo revert
kubeadm reset
参考来自 kubernetes 官方部署文档 转载请注明 from tomsun28