企业级容器技术 k8s的部署和使用

四台虚拟机

server1 192.168.122.2
server3 192.168.122.4
server4 192.168.122.5
server2 192.168.122.3 harbor仓库

k8s的安装

在三台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管理

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

service容器间访问

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: 32144/TCP端口号。

第二种创建方法是直接使用命令提前设置好。

kubectl expose deployment nginx --port=80 --target-port=80  --type=NodePort

这两种方法实际上效果相同,原理是在每台机器上绑定一个端口,这样就可以通过节点ip:分配的端口 相结合进行访问。例: http://192.168.122.2:32144

pod的扩容和缩减

扩容和缩减都使用参数–replicas后面跟几个就总容量为几

kubectl scale deployment nginx --replicas=3

pod的更新和回滚

更新使用命令

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

你可能感兴趣的:(企业级容器技术 k8s的部署和使用)