文章目录
第3章 部署k8s集群
安装docker
安装kubeadm,kubelet,kubectl
使用kubeadm创建集群
1.kubeadm初始化创建master
kubeadm init --apiserver-advertise-address 192.168.56.105 --pod-network-cidr=10.244.0.0/16
–apiserver-advertise-address 指明了使用master与其他节点的通信ip
–pod-network-cidr 指定pod网络的范围。
2.配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl 需要通过这个config文件访问K8s的apiserver,来获取集群的信息。
KUBECONFIG=xxx.conf kubectl get pods
所以使用不同的配置文件,就可以访问不同的集群
3.安装pod网络
没有pod网络,集群中的pod就不能相互通信。K8s有多种网络
flannel
创建flannel网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Cannal
4.添加node节点
在node节点上执行
kubeadm join --token xxxx 192.168.56.105:6443
token是master节点 kubeadm init时创建。可以通过kubeadm token list获取。
总结
k8s的组件都是由kubeadm控制,从官方库下载的镜像,然后运行的容器。他们都是k8s中的pod,属于集群中的一部分。
kubelet是唯一没有以容器形式运行的k8s组件。以systemd服务运行。
第5章 运行应用
Deployment
k8s支持两种创建资源的方式
- 使用命令创建
kubectl run nginx-deployment --image=nginx:1.9.1 --replicas2
- 使用配置文件
apiVersion: apps/v1 #apiserver版本,每个版本内功能可能不相同
kind: Deployment #资源类型
metadata: #deployment元数据,name是必要元数据项
name: bxy-local-nginx
namespace: kube-system #命名空间
spec: #deployment资源清单
replicas: 1 #副本数量
selector: #(必须项)保证和pod标签一致即可
matchLabels:
k8s-app: bxy-local-nginx-label
template: #pod模板
metadata: #pod元数据,至少有一个label
labels: #pod标签(必需项)
k8s-app: bxy-local-nginx-label
spec: #pod规格
imagePullSecrets:
- name: regcred
containers: #容器描述,name和image是必须
- name: bxy-local-nginx
image: mirrors.tencent.com/tcnp_tkestack/busybox:latest
imagePullPolicy: IfNotPresent #如果本地没有则拉取镜像库
volumeMounts: #挂载卷配置
- mountPath: /echo_dir #挂载容器目录
name: bxy-local-pv-volume #绑定的pv名称,和volumes.name一致
args:
- /bin/sh
- -c
- echo "hello world" > /echo_dir/hello; sleep 3000
volumes: #pv描述
- name: bxy-local-pv-volume #pv名称
persistentVolumeClaim:
claimName: bxy-local-pvc-volume #绑定的pvc名称
kubectl apply -f nginx.yml 应用nginx.yml配置文件
kubectl delete -f nginx.yml 或者 kubectl delete deployment_name 删除deployment
kubectl describe pod -n namespace 查看pod的详细情况
- 将master变成node使用。
kubectl tain node k8s-master node-role.kubernetes.io/master- 将master配置成node
kubectl tain node k8s-master node-role.kubernetes.io/master="":NoSchedule 恢复master only
- 使用label控制pod位置
- 通过label将pod部署到指定node
- 1.给node添加标签
kubectl label node k8s-node1 disktype=ssd 添加标签 kubectl label node k8s-node1 disktype- 删除标签
- 2.修改deployment配置
spec: containers: - name:nginx image: nginx:1.0.9 nodeSelector: disktype: ssd
- 直接指定部署的node
spec:
nodename: k8s-node1
nodename就是主机名,修改主机名
kubectl --hostname-override=node1
DaemonSet
DaemonSet的不同之处,每个node只能运行一个副本,一般用于监控daemon,日志收集daemon,存储daemon.
Job
容器分为服务型和工作型,服务型需要一直运行,工作型一次性任务,完成后容器退出。
第6章 通过service访问pod
pod内的容器共享同一个ip和端口空间,他们之间可以使用localhost通信。类似于同一个机器上的不同进程。
每一个pod都会分配一个IP,这个ip只能被集群内的容器和节点访问。
Pod可能会频繁地销毁和创建,也就是说Pod的IP不是固定的。为了解决这个问题,Service提供了访问Pod的抽象层。无论后端的Pod如何变化,Service都作为稳定的前端对外提供服务。同时,Service还提供了高可用和负载均衡功能,Service负责将请求转发给正确的Pod。
创建service
apiVersion: apps/v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx-test #pod标签
ports:
- protocol: TCP
port: