kubernetes基础
安装
关闭防火墙selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
关闭 swap
swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab
设置主机名称
hostnamectl set-hostname master
hostnamectl set-hostname node1
bash
在master节点中添加 hosts,即节点 IP地址+节点名称;
cat >> /etc/hosts << EOF
192.168.100.10 master
192.168.100.20 node1
EOF
iptables
将桥接的 IPv4 流量传递到 iptables 的链(所有节点都设置)
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#使其生效
sysctl --system
时间同步
master
yum install chrony -y
vi /etc/chrony.conf
3 server master iburst
# 客户端网络
26 allow 192.168.100.0/24
29 local stratum 10
systemctl restart chronyd
chronyc sources
node
yum install chrony -y
vi /etc/chrony.conf
3 server master iburst
systemctl restart chronyd
安装配置docker启动
yum install -y yum-utils device-mapper-persistent-data lvm2 \
&& yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo \
&& yum makecache fast \
&& yum -y install docker-ce 19.03.13\
&& mkdir -p /etc/docker/ \
&& echo -e '{\n "registry-mirrors": ["https://x3n9jrcg.mirror.aliyuncs.com"]\n}' > /etc/docker/daemon.json \
&& systemctl daemon-reload && systemctl start docker && systemctl enable docker
修改cgroup的驱动为systemd
编辑daemon.json文件,增加一行命令
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://x3n9jrcg.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
# 检查驱动Cgroup Driver是否是systemd
docker info |grep Cgroup
添加阿里云 yum 源
此步骤是为了便于今后的下载,在每个节点中执行以下配置;
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[Kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubernetes
- kubeadm、kubelet、kubectl 的安装
此处指定版本为 1.18.0,如果不指定默认下载最新版本。
#下载软件
yum install -y kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4
作为依赖被安装:
conntrack-tools.x86_64 0:1.4.4-7.el7 cri-tools.x86_64 0:1.25.0-0 kubernetes-cni.x86_64 0:1.1.1-0 libnetfilter_cthelper.x86_64 0:1.0.0-11.el7 libnetfilter_cttimeout.x86_64 0:1.0.0-7.el7 libnetfilter_queue.x86_64 0:1.0.2-2.el7_2 socat.x86_64 0:1.7.3.2-2.el7
完毕!
#开机自启动
systemctl start kubelet.service
systemctl enable kubelet
构造master
在 Master 节点中部署集群
在 master 节点中执行以下命令,注意将 master 节点 IP 和 kube 版本号修改为自己主机中所对应的。
kubeadm init \
--apiserver-advertise-address=192.168.1.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
检查
# 成功
Your Kubernetes control-plane has initialized successfully! ##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 # master执行
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.100.30:6443 --token vp743n.fg6cjmser10b8wfu \ #
--discovery-token-ca-cert-hash sha256:27be64661e6046937b49955850740800f74c5ad1ba26c854caf307b1e1789a2a #node
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-proxy v1.18.0 43940c34f24f 2 years ago 117MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.18.0 74060cea7f70 2 years ago 173MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.18.0 d3e55153f52f 2 years ago 162MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.18.0 a31f78c7c8ce 2 years ago 95.3MB
registry.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 2 years ago 683kB
registry.aliyuncs.com/google_containers/coredns 1.6.7 67da37a9a360 2 years ago 43.8MB
registry.aliyuncs.com/google_containers/etcd 3.4.3-0 303ce5db0e90 3 years ago 288MB
开启 kubectl 工具的使用
master
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
加入node
将 node 节点加入 master 中的集群
node
kubeadm join 192.168.100.30:6443 --token vp743n.fg6cjmser10b8wfu \
--discovery-token-ca-cert-hash sha256:27be64661e6046937b49955850740800f74c5ad1ba26c854caf307b1e1789a2a
之后加入node
查看token,token一般24小时失效,需要重新建
kubeadm token list
kubeadm token create
kubeadm token create --print-join-command 这个命令比较靠谱
5.获取ca证书sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
加入节点
可以通过
kubeadm token create --print-join-command # 获取加入的命令
执行完成之后在 master 节点中使用命令 kubectl get nodes 查看此时集群中的工作节点
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 9m10s v1.19.4
node1 NotReady <none> 51s v1.19.4
- 部署 CNI 网络插件
在上述操作完成后,各个工作节点已经加入了集群,但是它们的状态都是 NoReady,这是由于无它们无法跨主机通信的原因。而 CNI 网络插件的主要功能就是实现 pod 资源能够跨宿主机进行通信。在master节点中执行以下命令进行配置:
kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml
或者 学习时使用
# master
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
检查
然后使用命令 kubectl get pods -n kube-system 查看运行状态,1 代表运行中;
[root@master ~]# kubectl get pods -n kube-system
coredns-6d56c8448f-7n8fk 1/1 Running 0 11m
coredns-6d56c8448f-fnzrx 1/1 Running 0 11m
etcd-master 1/1 Running 0 12m
kube-apiserver-master 1/1 Running 0 12m
kube-controller-manager-master 1/1 Running 0 12m
kube-proxy-2gw75 1/1 Running 0 11m
kube-proxy-7mp6c 1/1 Running 0 10m
kube-scheduler-master 1/1 Running 0 12m
最后再次使用kubectl get nodes查看集群中的工作节点;可以看到处于开机状态的 master 节点和 node1 节点已经是 ready 状态,测试无误。
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 2m51s v1.19.4
node1 Ready <none> 2m26s v1.19.4
测试
部署nginx
master
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
# 等待status为runing
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-42hxd 1/1 Running 0 86s
[root@master ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4m4s
nginx NodePort 10.100.132.230 <none> 80:30612/TCP 35s
curl 192.168.100.20:30612 端口为80映射
常用命令
查看信息
- 查看集群信息
kubectl cluster-info
- 查看namespace信息
kubectl get namespace
- 查看暴露端口
kubectl get service
- 查看deployment
kubectl get deployment
- 查看pod
kubectl get pods
- 查看kube-system中的pods
kubectl get pods -n kube-system
- 查看详细信息
kubectl get pods -o wide
- 查看日志
kubectl logs [podname]
部署
- 创建
kubectl create deployment nginx --image=nginx
- 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
- 配置文件部署,支持json和yaml格式的文件
vi mysql-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- 使用create创建
kubectl create -f mysql-deploy.yml
- 创建namespace命名空间
kubectl create ns hello-yxb
- 创建数量为 --replicas=2
create deployment mynginx --image=nginx --replicas=2 --port=80
- 扩容缩容指定数量即可
kubectl scale --replicas=3 deployment mynginx
- 删除
kubectl delete deploymenet [n]
控制器
pod分类
- 自主式pod:pod退出了,此类型的pod不会被创建
- 控制器pod:在控制器生命周期里,始终维护pod的数目
控制器:kubernetes中有很多controller(控制器),这些相当于一个状态机,用来控制pod的具体状态和行为
控制器类型
- ReplicationController [淘汰] 和ReplicaSet
- Deployment
- DaemonSet
-
- Job/CronJob
- Horizontal Pod Autoscaling
ReplicationController [淘汰] 和ReplicaSet
ReplicationController [淘汰] 和ReplicaSet(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的pod来替代;而如果异常多出来的容器也会自动回收;
在新版的kubernetes中建议使用ReplicaSet来取代ReplicationController。ReplicaSet跟ReplicationController没有本质的不同。只是名字不一样,并且ReplicaSet支持集合式的selector;
Deployment
deployment为pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。典型的应用场景包括;
- 定义Deployment来创建pod和ReplicaSet
- 滚动升级和回滚应用
- 库容和缩容
- 暂停和继续Deployment
DeamonSet
DaemonSet确保全部(或者一些)Node上运行一个pod的副本。当有一个Node加入集群时,也会为他们新增一个pod。当有一个Node从集群上移除时,pod也会回收。删除DaemonSet将会删除它们的所有pod
使用DaemonSet的一些典型用法:
- 运行集群存储daemon,例如在每一个Node上运行
glusterd,ceph - 在每个Node上运行日志收集daemon,例如
fluentd,logstash - 在每个Node上运行监控daemon,例如Prometheus Node Exporter、collectd、Datadog代理、New Relic代理,或Gangliagmond
Job
job负责批处理任务,即仅执行一次任务,它保证批处理任务的一个或多个pod成功结束
CronJob
CronJob管理基于时间的Job,即:
- 在给定时间点只运行一次
- 周期性的在给定时间点运行
使用前提条件:当前的kubernetes集群,版本>=1.8(对CronJob)
典型用法
- 给定的时间点调度Job
- 创建周期性运行的Job,例如:数据库备份,发送邮件
StatefulSet
StatefulSet作为Controller为Pod提供了唯一的标识。它可以保证部署和scale的顺序
StatefulSet是为了解决有状态服务的问题(对应Deployment和ReplicaSet是为了无状态服务而设计),其服务场景包括:
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP和Service)来实现
- 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
- 有序收缩,有序删除(即从N-1到0)
Horizontal Pod Autoscaling
应用的资源使用率通常都有高峰和低谷的时候,如何削峰填谷,提高集群的整体资源利用率,让service中的Pod个数自动调整呢?这就有赖于Horizontal Pod Autoscaling了,故名思义,使Pod水平自动缩放
更多推荐



所有评论(0)