四台虚拟机
server1 192.168.122.2
server3 192.168.122.4
server4 192.168.122.5
server2 192.168.122.3 harbor仓库
在三台server1,3.4虚拟机上安装docker并启动,在server2上启动仓库容器。
关闭swap分区,并且在文件中注释掉关于swap分区的行。注意这两个步骤不能反了,要不然swapoff -a命令会找不到对象。
swapoff -a
vim /etc/fstab
在每个节点进行设置
[root@server1 ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
sysctl --system
k8s使用时一定需要网络支持。
安装k8s的时候可以用本地安装包也可以使用网络源进行安装。
使用本地安装需要下载如下安装包。
cri-tools-1.13.0-0.x86_64.rpm
kubelet-1.15.0-0.x86_64.rpm
kubeadm-1.15.0-0.x86_64.rpm
kubernetes-cni-0.7.5-0.x86_64.rpm
kubectl-1.15.0-0.x86_64.rpm
使用网络源安装需要进行设置。可以首先写一些条件,加入原来配置的镜像加速器中。(这个文件可以改也可以不改),主要添加一行。
{
"registry-mirrors": ["https://yot2uoql.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
修改cgroupdriver是为了消除告警。
将这个文件同时写入其他虚拟机中。并且读取文件。
systemctl daemon-reload
systemctl restart docker.service
下一步开始设置yum网络源。
根据官方文档进行设置。
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
给所有虚拟机发送过去进行配置。
在网络源下需要安装三个软件。
yum install kubelet kubeadm kubectl -y
安装完成后先将kubelet启动。
systemctl enable --now kubelet.service
但是现在还不能工作,需要继续配置。
使用命令查看默认配置信息。
kubeadm config print init-defaults
其中镜像默认地址在国外,需要科学上网才可以访问。
imageRepository: k8s.gcr.io
现在如何拉取镜像?我们继续使用阿里云,如何设置?使用--image-repository
这个参数,后面加上镜像网站,如果不加这个参数则默认从k8s.gcr.io网站上进行拉取。
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers ##列出所有镜像。
查看后有这些东西,下面就将镜像进行拉取。
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
拉取下来后进行部署,如果网络太慢可以提前将镜像的tar包进行下载,之后导入自己的私有仓库,后面部署就比较方便了。
完成后开始初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers
看到如下就说明初始化已经成功。
Your Kubernetes control-plane has initialized 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
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.122.2:6443 --token 53ln9d.drupofpu7cq228ex \
--discovery-token-ca-cert-hash sha256:43226af8371f011997416c686af9d92786641d66895b7e34ef4ddbf5b112fb37
最后一行是需要在其他节点上操作,进行节点扩充。
如果在初始化节点时报错了,那么使用命令
kubeadm reset
来清理之前的信息,避免信息冲突。
扩充节点时要注意token这个东西
我们可以查看一下token的信息
kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
yhdv0a.d8z0rputjccsxtad 23h 2020-02-17T14:44:58+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
可以看到这个token现在还有23小时,因为这个东西是24小时一换,如果超过24小时想要再加入节点,那么需要再生成一个token使用新的token将节点加入。
新建token使用命令
kubeadm token create
之后进行下一步
提示操作最好使用一个普通用户,但是用root用户也是可以的。
首先创建一个用户
useradd kubeadm
然后将这个用户添加进sudo命令中
visudo
在如下的地方添加
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
kubeadm ALL=(ALL) NOPASSWD: ALL
切换到用户中根据提示使用命令,这些命令在创建好节点的时候就会出现。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
创建好文件后可以进行查看
kubectl get node
NAME STATUS ROLES AGE VERSION
server1 NotReady master 16m v1.17.3
server3 NotReady <none> 15m v1.17.3
server4 NotReady <none> 14m v1.17.3
这样就可以看到三个节点部署完毕。
使用命令查看是否健康
kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
注:kubectl 的命令是可以补全的但是需要手动进行添加。
echo "source <(kubectl completion bash)">> ~/.bashrc
添加完成后需要让系统读取文件然后就可以使用了。
之后查看节点也需要一点一点来
首先
kubectl get ns
NAME STATUS AGE
default Active 34m
kube-node-lease Active 34m
kube-public Active 34m
kube-system Active 34m
再继续使用命令查看kube-system
的信息
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-9d85f5447-r2727 0/1 Pending 0 33m
coredns-9d85f5447-zsscj 0/1 Pending 0 33m
etcd-server1 1/1 Running 0 33m
kube-apiserver-server1 1/1 Running 0 33m
kube-controller-manager-server1 1/1 Running 0 33m
kube-proxy-49khk 1/1 Running 0 32m
kube-proxy-65g98 1/1 Running 0 33m
kube-proxy-jrwk8 1/1 Running 0 33m
kube-scheduler-server1 1/1 Running 0 33m
看到里面有两个东西还在准备中并没有启动。
这需要添加一个文件。文件可以下载也可以手动添加。
将https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml
网址中的配置文件复制粘贴出来。
使用纯vi的编辑器,这样会整齐
\vi kube-flannel.yml
添加之后
再给每个节点添加一个镜像
docker load -i flannel.tar
添加完成读取文件
kubectl apply -f kube-flannel.yml
这样就连接完成,并且部署已经完成。
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-9d85f5447-r2727 1/1 Running 0 169m
coredns-9d85f5447-zsscj 1/1 Running 0 169m
etcd-server1 1/1 Running 2 169m
kube-apiserver-server1 1/1 Running 2 169m
kube-controller-manager-server1 1/1 Running 4 169m
kube-flannel-ds-amd64-ggbwz 1/1 Running 0 82m
kube-flannel-ds-amd64-q4lsg 1/1 Running 0 82m
kube-flannel-ds-amd64-x2w7h 1/1 Running 0 82m
kube-proxy-49khk 1/1 Running 1 168m
kube-proxy-65g98 1/1 Running 2 169m
kube-proxy-jrwk8 1/1 Running 1 169m
kube-scheduler-server1 1/1 Running 4 169m
但这个时候的调度master节点是不参加的。如果让master节点也参加,那么使用命令。
kubectl taint nodes --all node-role.kubernetes.io/master-
pod是k8s中的最小单位,相当于一个壳,壳中有docker。
我们可以直接使用k8s的命令,在pod中直接运行容器进行应用部署。
kubectl run nginx --image=nginx --replicas=2 --record
## 第一个nginx是我们起的名字,image后面跟的是docker镜像,后面的个数是启动几个容器,最后的参数是记录,为了有时候更新失败方便回滚。
应用部署完成后可以使用
kubectl delete pod 应用id
对应用进行删除,但是再查看pod时你会发现删除之后会给你再新建利出来一个,应用的个数始终是部署应用时–replicas=这个参数后面跟的个数。想真正将应用删除需要在pod部署时添加参数--restart=Never
或者直接将整个部署应用删除
kubectl delete deployment nginx
pod部署好了只能在内部集群进行访问,外部无法访问
访问的地址可以使用命令可以直接查看到ip地址。
使用service微服务进行访问,首先需要创建一个。以创建好的nginx 应用为例。
kubectl expose deployment nginx --port=80 --target-port=80 ##主动暴露80端口
查看信息
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h58m
nginx ClusterIP 10.103.51.227 <none> 80/TCP 10s
创建完成会给一个ip地址,使用这个地址属于同一节点的机器还是不能进行访问,但是内部的容器可以通过这个ip或者之前设置的名字(之前这个设置的名字就是nginx)进行访问。
那如何能让外部访问这个pod?
这也有两种方法:
第一种方法,在原有servive的基础上修改网络类型。
kubectl edit svc nginx
输入这个命令会打开一个配置文件。在文件中将类型type进行修改。
type: ClusterIP --> type: NodePort
这样就进行了修改
kubectl describe svc nginx
Name: nginx
Namespace: default
Labels: run=nginx
Annotations: <none>
Selector: run=nginx
Type: ClusterIP
IP: 10.103.51.227
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.0.3:80,10.244.2.3:80
Session Affinity: None
Events: <none>
kubectl describe svc nginx
Name: nginx
Namespace: default
Labels: run=nginx
Annotations: <none>
Selector: run=nginx
Type: NodePort
IP: 10.103.51.227
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32144/TCP
Endpoints: 10.244.0.3:80,10.244.2.3:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
这样外部就可以进行访问了,如何进行访问,在外部浏览器输入任意server的地址,后面端口号加上上面的NodePort:
端口号。
第二种创建方法是直接使用命令提前设置好。
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
这两种方法实际上效果相同,原理是在每台机器上绑定一个端口,这样就可以通过节点ip:分配的端口 相结合进行访问。例: http://192.168.122.2:32144
扩容和缩减都使用参数–replicas后面跟几个就总容量为几
kubectl scale deployment nginx --replicas=3
更新使用命令
kubectl set image deployment/nginx nginx=需要的版本号
回滚使用命令
kubectl rollout undo deployment nginx --to-revision=1
他这个后面的1是什么意思?这时查看更新时的历史记录的序号
kubectl rollout history deployment nginx
deployment.apps/nginx
REVISION CHANGE-CAUSE
1 kubectl run nginx --image=nginx --replicas=2 --record=true