The issue with SnappyHexMesh (the meshing algo) is that it is an iterative mesher and generates layers upon layers. If you read through the workflow of Snappy, you will see that there is a step where it attempts to conform and reiterate the mesh to best fit the geometry.
This is good when complex geometries are involved as it means less work individually refining specific areas which would take a lot of time. But in your case of a simple geometry, it continues to do the same thing. Referring to the figure below, you can see that the ends of the pipe are more refined than say the middle. The layers are iterated accordingly and thus you get a deviation of y+ as you progress through the geometry.
The potential fix would be set a topological entity set for the inlet and outlet so that the automatic mesher will not attempt to refine the ends of the pipe. By controlling this you force the mesh to be consistent through out the pipe and as such the layering process will also be consistent through the iterations. However, this specific workflow may not work as the automatic mesher has changed since the last time I used it. If we are unable to control the mesher, then we will need to switch to the parametric one where we have greater control.
Try this out and let us know how it goes.
Do consider your simulation as well. Selection of turbulence model and usage of wall functions will dictate your y+ values.