本文指定Docker与K8s版本,保证兼容性,可供参考
三台虚拟机执行以下命令
# 1.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 2.关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭(或者选择permissive宽容模式,disable在aarch64架构虚拟机开机docker无法运行)
setenforce 0 # 临时关闭
# 3.关闭 swap
swapoff -a # 临时关闭
vim /etc/fstab # 永久关闭
#注释掉swap这行
# /dev/mapper/centos‐swap swap swap defaults 0 0
systemctl reboot #重启生效
free -m #查看下swap交换区是否都为0,如果都为0则swap关闭成功
# 4.给三台机器分别设置主机名
hostnamectl set-hostname <hostname>
# 第一台:k8smaster
# 第二台:k8snode1
# 第三台:k8snode2
# 5.在k8s‐master机器添加hosts,执行如下命令,ip需要修改成你自己机器的ip
cat >> /etc/hosts << EOF
192.168.***.133 k8s-master
192.168.***.134 k8s-node1
192.168.***.135 k8s-node2
EOF
sysctl --system # 生效
# 6.将桥接的IPv4流量传递到iptables
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 立即生效
sysctl -p /etc/sysctl.d/k8s.conf
# 7.设置时间同步
yum install ntpdate -y
ntpdate time.windows.com
# 1、设置k8s yum源
# x86: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
# aarch64: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
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
# 2、如果之前安装过k8s,先卸载旧版本
yum remove -y kubelet kubeadm kubectl
# 3、查看可以安装的版本
yum list kubelet --showduplicates | sort -r
# 4、安装kubelet、kubeadm、kubectl 指定版本,我们使用kubeadm方式安装k8s集群
# 此处出现的问题:附录二
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 5、开机启动kubelet
systemctl enable kubelet
# 6、在k8s-master机器上执行初始化操作(里面的第一个ip地址就是k8s-master机器的ip,改成你自己机器的,后面两个ip网段不用动)
# 此处出现的问题: 附录四
kubeadm init --apiserver-advertise-address=192.168.***.133 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap
# 7.启动k8s (启动失败现象,附录三)
systemctl start kubelet
# 查看启动状态
systemctl status kubelet -l
# 查看启动日志
journalctl -xefu kubelet
# 在k8s-master上配置使用 kubectl 命令工具(类似docker这个命令),
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#查看kubectl是否能正常使用
kubectl get nodes
#安装 Pod 网络插件
kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml
# 如果上面这个calico网络插件安装不成功可以试下下面这个
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kubeflannel.yml
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 将node节点加入进master节点的集群里 (三台机器都执行)
kubeadm join 192.168.145.133:6443 --token xiwdb1.ivwp175n7l2c7mad \
--discovery-token-ca-cert-hash sha256:7ff5423635326f54a5b901f4caec367170fa6d2f29fe095434d5d42d6f0bfe93
kubeadm join 192.168.145.133:6443 --token xiwdb1.ivwp175n7l2c7mad \
--discovery-token-ca-cert-hash sha256:7ff5423635326f54a5b901f4caec367170fa6d2f29fe095434d5d42d6f0bfe93
在k8smaster上执行:
# 创建一次deployment部署
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看Nginx的pod和service信息
kubectl get pod,svc -o wide
启动成功:
访问Nginx地址: http://任意node节点的ip:图中Nginx的对外映射端口,http://192.168.***.134:32127
kubectl是apiserver的客户端工具,工作在命令行下,能够连接apiserver实现各种增删改等操作 kubectl官方使用文档:https://kubernetes.io/zh/docs/reference/kubectl/overview/
# 使用 kubectl create deployment 命令可以创建一个应用部署deployment与Pod
#my‐tomcat表示pod的名称 ‐‐image表示镜像的地址
kubectl create deployment my‐tomcat --image=tomcat:7.0.75-alpine
# 查看deployment信息
kubectl get deployment
# Pod相关命令:
# 查看pod信息 -o wide 表示详细信息显示
kubectl get pod -o wide
# -w 一直等待观察pod信息变动
kubectl get pod -w
# 查看pod打印的日志
kubectl logs (pod名称)
# exec可以进入pod容器
# env命令可以查看环境变量
kubectl exec (pod名称) -- env
# ls查看容器根目录下内容
kubectl exec (pod名称) -- ls
# sh进入容器
kubectl exec (pod名称) -- sh
# 删除pod
kubectl delete pod (pod名称)
# service 相关命令:
# 创建service
kubectl expose deployment my‐tomcat --name=tomcat --port=8080 --type=NodePort
# 查看service信息
kubectl get svc -o wide
# 扩、缩容
# 扩容到5个pod,如果缩容到3个就是--replicas=3
kubectl scale --replicas=5 deployment my-tomcat(这里my-tomcat是deployment name)
# 滚动升级与回滚
# 滚动升级:
kubectl set image deployment my‐tomcat tomcat=tomcat:8.0.41-jre8-alpine
# 查看某个pod的详细信息
kubectl describe pod pod名称
# 版本回滚:
# 查看历史版本
kubectl rollout history deploy my-tomcat
# 回滚到上一版本 后面增加--to-reversion 参数可以指定回滚版本
kubectl rollout undo deployment my-tomcat
# 标签的使用 Label
# 通过Label查询pod、service
kubectl get pods -l app=my-tomcat
kubectl get services -l app=my-tomcat
# 给pod添加label,label为version=v1
kubectl label pod pod名称 version=v1
# 通过label删除服务
kubectl delete service -l app=test-service
之前我们直接用命令创建deployment,pod,service这些资源,其实在k8s中,我们一般都会使用yaml格式的文件来创建符合我们预期期望的资源,这样的yaml文件我们一般称为资源清单。
用yaml创建deployment资源的对象
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine --dry-run -o yaml
# 如果没有给定group名称,那么默认为croe,
# 可以使用kubectl api‐versions
# 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
apiVersion: apps/v1
# 资源类别
kind: Deployment
# 资源元数据
metadata:
creationTimestamp: null
labels:
app: my-tomcat-1
name: my-tomcat-1 # deployment名称
# 期望状态
spec:
replicas: 1 #pod副本数
selector:
matchLabels:
app: my-tomcat-1
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-tomcat-1
spec:
containers:
- image: tomcat
name: tomcat
resources: {}
# 当前状态,用户不能定义,由k8s维护
status: {}
kubectl apply -f deployment-demo.yaml
还可以用yaml创建service资源的对象
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort --dry-run -o yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-tomcat-1
name: tomcat #service名称
spec:
ports:
- port: 8080 # service的虚拟ip对应的端口,在集群内网机器可以访问用service的虚拟ip加该端口号访问服务
protocol: TCP
targetPort: 8080 # pod暴露的端口,一般与pod内部容器暴露的端口一致
selector:
app: my-tomcat-1
type: NodePort
status:
loadBalancer: {}
执行命令如下命令就可以用yaml文件来创建service
kubectl apply -f service-demo.yaml
针对已有资源输出资源清单yaml,用yaml创建pod资源的对象
#使用 -o 参数加yaml,可以将资源的配置以yaml的格式输出出来,也可以使用json,输出为json格式
kubectl get pod nginx-f89759699-vtcvl -o yaml
# 查看内核版本
uname ‐r
# yum-util 提供yum-config-manager功能
yum install -y yum‐utils
# 设置yum源,并更新 yum 的包索引
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
# 注意: 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-19.03.9-3.el7 -y # 这是指定版本安装
systemctl start docker && systemctl enable docker
docker version
cat > /usr/lib/python2.7/site-packages/sitecustomize.py << EOF
#encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
EOF
# 重启python编译器
python
journalctl -xefu kubelet 查看启动日志,发现:
Jan 30 10:30:20 k8s-node1 kubelet[1797]: F0130 10:30:20.011562 1797 server.go:199] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file “/var/lib/kubelet/config.yaml”, error: open /var/lib/kubelet/config.yaml: no such file or directory
解决方案:
# 执行kubeadm init
kubeadm init --kubernetes-version=v1.18.0 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.***.***
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
# 修改配置文件
vim /etc/docker/daemon.json
# 增加以下配置json
{
"exec-opts":["native.cgroupdriver=systemd"]
}
# 重启docker
systemctl restart docker
要删除 k8snode1 这个节点,首先在 master 节点上依次执行以下两个命令
kubectl drain k8snode1 --delete-local-data --force --ignore-daemonsets
kubectl delete node k8snode1
执行后通过 kubectl get node 命令可以看到 k8snode1 已被成功删除 接着在 k8snode1 这个 Node 节点上执行如下命令,这样该节点即完全从 k8s 集群中脱离开来,之后就可以重新执 行命令添加到集群
kubeadm reset